blob: fe8002bdd4bcd6645d6e8613f4ea6d17ae03adc2 [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//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 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 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500192 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000193 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500194 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000195 }
196
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000197 switch (target)
198 {
199 case GL_ARRAY_BUFFER:
200 context->bindArrayBuffer(buffer);
201 return;
202 case GL_ELEMENT_ARRAY_BUFFER:
203 context->bindElementArrayBuffer(buffer);
204 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000205 case GL_COPY_READ_BUFFER:
206 context->bindCopyReadBuffer(buffer);
207 return;
208 case GL_COPY_WRITE_BUFFER:
209 context->bindCopyWriteBuffer(buffer);
210 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000211 case GL_PIXEL_PACK_BUFFER:
212 context->bindPixelPackBuffer(buffer);
213 return;
214 case GL_PIXEL_UNPACK_BUFFER:
215 context->bindPixelUnpackBuffer(buffer);
216 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 case GL_UNIFORM_BUFFER:
218 context->bindGenericUniformBuffer(buffer);
219 return;
220 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000221 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000222 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000224 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225 }
226 }
227 }
228 catch(std::bad_alloc&)
229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231 }
232}
233
234void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000236 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237
238 try
239 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500240 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243 }
244
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246
247 if (context)
248 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000249 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindReadFramebuffer(framebuffer);
252 }
253
254 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
255 {
256 context->bindDrawFramebuffer(framebuffer);
257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259 }
260 catch(std::bad_alloc&)
261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263 }
264}
265
266void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000268 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000269
270 try
271 {
272 if (target != GL_RENDERBUFFER)
273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 }
276
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278
279 if (context)
280 {
281 context->bindRenderbuffer(renderbuffer);
282 }
283 }
284 catch(std::bad_alloc&)
285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000286 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 }
288}
289
290void __stdcall glBindTexture(GLenum target, GLuint texture)
291{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000292 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
294 try
295 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297
298 if (context)
299 {
300 gl::Texture *textureObject = context->getTexture(texture);
301
302 if (textureObject && textureObject->getTarget() != target && texture != 0)
303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000304 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305 }
306
307 switch (target)
308 {
309 case GL_TEXTURE_2D:
310 context->bindTexture2D(texture);
311 return;
312 case GL_TEXTURE_CUBE_MAP:
313 context->bindTextureCubeMap(texture);
314 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000315 case GL_TEXTURE_3D:
316 if (context->getClientVersion() < 3)
317 {
318 return gl::error(GL_INVALID_ENUM);
319 }
320 context->bindTexture3D(texture);
321 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000322 case GL_TEXTURE_2D_ARRAY:
323 if (context->getClientVersion() < 3)
324 {
325 return gl::error(GL_INVALID_ENUM);
326 }
327 context->bindTexture2DArray(texture);
328 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000329 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332 }
333 }
334 catch(std::bad_alloc&)
335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337 }
338}
339
340void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000342 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000343 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344
345 try
346 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000347 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348
349 if (context)
350 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000351 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353 }
354 catch(std::bad_alloc&)
355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357 }
358}
359
360void __stdcall glBlendEquation(GLenum mode)
361{
362 glBlendEquationSeparate(mode, mode);
363}
364
365void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000367 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368
369 try
370 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000371 gl::Context *context = gl::getNonLostContext();
372
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373 switch (modeRGB)
374 {
375 case GL_FUNC_ADD:
376 case GL_FUNC_SUBTRACT:
377 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000378 case GL_MIN:
379 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000380 break;
381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 }
385
386 switch (modeAlpha)
387 {
388 case GL_FUNC_ADD:
389 case GL_FUNC_SUBTRACT:
390 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000391 case GL_MIN:
392 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000393 break;
394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000396 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 if (context)
400 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000401 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
411{
412 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
413}
414
415void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000417 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 +0000418 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419
420 try
421 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000422 gl::Context *context = gl::getNonLostContext();
423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 switch (srcRGB)
425 {
426 case GL_ZERO:
427 case GL_ONE:
428 case GL_SRC_COLOR:
429 case GL_ONE_MINUS_SRC_COLOR:
430 case GL_DST_COLOR:
431 case GL_ONE_MINUS_DST_COLOR:
432 case GL_SRC_ALPHA:
433 case GL_ONE_MINUS_SRC_ALPHA:
434 case GL_DST_ALPHA:
435 case GL_ONE_MINUS_DST_ALPHA:
436 case GL_CONSTANT_COLOR:
437 case GL_ONE_MINUS_CONSTANT_COLOR:
438 case GL_CONSTANT_ALPHA:
439 case GL_ONE_MINUS_CONSTANT_ALPHA:
440 case GL_SRC_ALPHA_SATURATE:
441 break;
442 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444 }
445
446 switch (dstRGB)
447 {
448 case GL_ZERO:
449 case GL_ONE:
450 case GL_SRC_COLOR:
451 case GL_ONE_MINUS_SRC_COLOR:
452 case GL_DST_COLOR:
453 case GL_ONE_MINUS_DST_COLOR:
454 case GL_SRC_ALPHA:
455 case GL_ONE_MINUS_SRC_ALPHA:
456 case GL_DST_ALPHA:
457 case GL_ONE_MINUS_DST_ALPHA:
458 case GL_CONSTANT_COLOR:
459 case GL_ONE_MINUS_CONSTANT_COLOR:
460 case GL_CONSTANT_ALPHA:
461 case GL_ONE_MINUS_CONSTANT_ALPHA:
462 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000463
464 case GL_SRC_ALPHA_SATURATE:
465 if (!context || context->getClientVersion() < 3)
466 {
467 return gl::error(GL_INVALID_ENUM);
468 }
469 break;
470
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000471 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473 }
474
475 switch (srcAlpha)
476 {
477 case GL_ZERO:
478 case GL_ONE:
479 case GL_SRC_COLOR:
480 case GL_ONE_MINUS_SRC_COLOR:
481 case GL_DST_COLOR:
482 case GL_ONE_MINUS_DST_COLOR:
483 case GL_SRC_ALPHA:
484 case GL_ONE_MINUS_SRC_ALPHA:
485 case GL_DST_ALPHA:
486 case GL_ONE_MINUS_DST_ALPHA:
487 case GL_CONSTANT_COLOR:
488 case GL_ONE_MINUS_CONSTANT_COLOR:
489 case GL_CONSTANT_ALPHA:
490 case GL_ONE_MINUS_CONSTANT_ALPHA:
491 case GL_SRC_ALPHA_SATURATE:
492 break;
493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000494 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000495 }
496
497 switch (dstAlpha)
498 {
499 case GL_ZERO:
500 case GL_ONE:
501 case GL_SRC_COLOR:
502 case GL_ONE_MINUS_SRC_COLOR:
503 case GL_DST_COLOR:
504 case GL_ONE_MINUS_DST_COLOR:
505 case GL_SRC_ALPHA:
506 case GL_ONE_MINUS_SRC_ALPHA:
507 case GL_DST_ALPHA:
508 case GL_ONE_MINUS_DST_ALPHA:
509 case GL_CONSTANT_COLOR:
510 case GL_ONE_MINUS_CONSTANT_COLOR:
511 case GL_CONSTANT_ALPHA:
512 case GL_ONE_MINUS_CONSTANT_ALPHA:
513 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000514
515 case GL_SRC_ALPHA_SATURATE:
516 if (!context || context->getClientVersion() < 3)
517 {
518 return gl::error(GL_INVALID_ENUM);
519 }
520 break;
521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000524 }
525
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000526 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
527 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
528
529 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
530 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
531
532 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000534 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 +0000535 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 if (context)
539 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000540 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542 }
543 catch(std::bad_alloc&)
544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546 }
547}
548
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000549void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000551 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 +0000552 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000553
554 try
555 {
556 if (size < 0)
557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559 }
560
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000561 gl::Context *context = gl::getNonLostContext();
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 switch (usage)
564 {
565 case GL_STREAM_DRAW:
566 case GL_STATIC_DRAW:
567 case GL_DYNAMIC_DRAW:
568 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000569
570 case GL_STREAM_READ:
571 case GL_STREAM_COPY:
572 case GL_STATIC_READ:
573 case GL_STATIC_COPY:
574 case GL_DYNAMIC_READ:
575 case GL_DYNAMIC_COPY:
576 if (context && context->getClientVersion() < 3)
577 {
578 return gl::error(GL_INVALID_ENUM);
579 }
580 break;
581
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 }
585
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 if (context)
587 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000590 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591 }
592
Jamie Madill8c96d582014-03-05 15:01:23 -0500593 gl::Buffer *buffer = context->getTargetBuffer(target);
594
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 if (!buffer)
596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000597 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000600 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602 }
603 catch(std::bad_alloc&)
604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000605 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606 }
607}
608
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000609void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000611 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 +0000612 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613
614 try
615 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000616 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619 }
620
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000621 if (data == NULL)
622 {
623 return;
624 }
625
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000627
628 if (context)
629 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000632 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000633 }
634
Jamie Madill8c96d582014-03-05 15:01:23 -0500635 gl::Buffer *buffer = context->getTargetBuffer(target);
636
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 if (!buffer)
638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000640 }
641
Jamie Madill7a5f7382014-03-05 15:01:24 -0500642 if (buffer->mapped())
643 {
644 return gl::error(GL_INVALID_OPERATION);
645 }
646
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000647 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000650 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000651
652 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 }
655 catch(std::bad_alloc&)
656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 }
659}
660
661GLenum __stdcall glCheckFramebufferStatus(GLenum target)
662{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000663 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664
665 try
666 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500667 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000669 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 }
671
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000672 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673
674 if (context)
675 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500676 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
677 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 return framebuffer->completeness();
679 }
680 }
681 catch(std::bad_alloc&)
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
686 return 0;
687}
688
689void __stdcall glClear(GLbitfield mask)
690{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000691 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692
693 try
694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696
697 if (context)
698 {
Geoff Lang0b833232013-08-21 10:13:29 -0400699 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
700
701 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
702 {
703 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
704 }
705
706 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
707 {
708 return gl::error(GL_INVALID_VALUE);
709 }
710
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000711 context->clear(mask);
712 }
713 }
714 catch(std::bad_alloc&)
715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 }
718}
719
720void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000722 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000723 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 try
726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728
729 if (context)
730 {
731 context->setClearColor(red, green, blue, alpha);
732 }
733 }
734 catch(std::bad_alloc&)
735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737 }
738}
739
740void __stdcall glClearDepthf(GLclampf depth)
741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000742 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743
744 try
745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000747
748 if (context)
749 {
750 context->setClearDepth(depth);
751 }
752 }
753 catch(std::bad_alloc&)
754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000756 }
757}
758
759void __stdcall glClearStencil(GLint s)
760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000761 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762
763 try
764 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000766
767 if (context)
768 {
769 context->setClearStencil(s);
770 }
771 }
772 catch(std::bad_alloc&)
773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776}
777
778void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
779{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000780 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000781 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 try
784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786
787 if (context)
788 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000789 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790 }
791 }
792 catch(std::bad_alloc&)
793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796}
797
798void __stdcall glCompileShader(GLuint shader)
799{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000800 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 try
803 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000805
806 if (context)
807 {
808 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000809
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810 if (!shaderObject)
811 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000812 if (context->getProgram(shader))
813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000814 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000815 }
816 else
817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000819 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820 }
821
822 shaderObject->compile();
823 }
824 }
825 catch(std::bad_alloc&)
826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 }
829}
830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000831void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
832 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000834 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000835 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 target, level, internalformat, width, height, border, imageSize, data);
837
838 try
839 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000841
842 if (context)
843 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000844 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400845 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000846 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
847 {
848 return;
849 }
850
851 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400852 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400853 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000854 {
855 return;
856 }
857
858 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000861 }
862
863 switch (target)
864 {
865 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000866 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000867 gl::Texture2D *texture = context->getTexture2D();
868 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000869 }
870 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000871
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
873 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
874 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
875 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
877 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000878 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000879 gl::TextureCubeMap *texture = context->getTextureCubeMap();
880 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000881 }
882 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000883
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000885 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000886 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000887 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000888 }
889 catch(std::bad_alloc&)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 }
893}
894
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000895void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
896 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000898 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000899 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000900 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 target, level, xoffset, yoffset, width, height, format, imageSize, data);
902
903 try
904 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000905 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000906
907 if (context)
908 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000909 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400910 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000911 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
912 {
913 return;
914 }
915
916 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400917 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400918 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000919 {
920 return;
921 }
922
923 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000926 }
927
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000928 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000929 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000930 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000931 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000932 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000933 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000934 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000935 break;
936
937 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
938 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
939 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
940 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
942 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000943 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000945 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000946 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000947 break;
948
949 default:
950 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000951 }
952 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 }
954 catch(std::bad_alloc&)
955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
958}
959
960void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000962 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000963 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 target, level, internalformat, x, y, width, height, border);
965
966 try
967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000969
970 if (context)
971 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000972 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400973 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000974 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000975 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000976 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000977 }
978
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400980 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000981 0, 0, 0, x, y, width, height, border))
982 {
983 return;
984 }
985
986 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
987
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000988 switch (target)
989 {
990 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000992 gl::Texture2D *texture = context->getTexture2D();
993 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 }
995 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
998 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1005 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 }
1007 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001008
1009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001011 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001013 }
1014 catch(std::bad_alloc&)
1015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018}
1019
1020void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001024 target, level, xoffset, yoffset, x, y, width, height);
1025
1026 try
1027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001029
1030 if (context)
1031 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001032 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001033 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001034 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001035 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001036 return;
1037 }
1038
1039 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001040 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001041 xoffset, yoffset, 0, x, y, width, height, 0))
1042 {
1043 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001044 }
1045
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001046 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001047
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001048 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001049 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001050 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001051 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 gl::Texture2D *texture = context->getTexture2D();
1053 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001054 }
1055 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056
1057 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1058 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1060 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001063 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1065 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001066 }
1067 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001069 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001071 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001074
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001075 catch(std::bad_alloc&)
1076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001078 }
1079}
1080
1081GLuint __stdcall glCreateProgram(void)
1082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001083 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084
1085 try
1086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088
1089 if (context)
1090 {
1091 return context->createProgram();
1092 }
1093 }
1094 catch(std::bad_alloc&)
1095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001096 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001097 }
1098
1099 return 0;
1100}
1101
1102GLuint __stdcall glCreateShader(GLenum type)
1103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001104 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001105
1106 try
1107 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109
1110 if (context)
1111 {
1112 switch (type)
1113 {
1114 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001115 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001116 return context->createShader(type);
1117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 }
1120 }
1121 }
1122 catch(std::bad_alloc&)
1123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126
1127 return 0;
1128}
1129
1130void __stdcall glCullFace(GLenum mode)
1131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001132 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001133
1134 try
1135 {
1136 switch (mode)
1137 {
1138 case GL_FRONT:
1139 case GL_BACK:
1140 case GL_FRONT_AND_BACK:
1141 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001143
1144 if (context)
1145 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001146 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001147 }
1148 }
1149 break;
1150 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001151 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001152 }
1153 }
1154 catch(std::bad_alloc&)
1155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 }
1158}
1159
1160void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001162 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163
1164 try
1165 {
1166 if (n < 0)
1167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169 }
1170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172
1173 if (context)
1174 {
1175 for (int i = 0; i < n; i++)
1176 {
1177 context->deleteBuffer(buffers[i]);
1178 }
1179 }
1180 }
1181 catch(std::bad_alloc&)
1182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184 }
1185}
1186
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001187void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001189 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001190
1191 try
1192 {
1193 if (n < 0)
1194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001195 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001196 }
1197
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001198 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001199
1200 if (context)
1201 {
1202 for (int i = 0; i < n; i++)
1203 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001204 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001205 }
1206 }
1207 }
1208 catch(std::bad_alloc&)
1209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001211 }
1212}
1213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001216 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217
1218 try
1219 {
1220 if (n < 0)
1221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001223 }
1224
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226
1227 if (context)
1228 {
1229 for (int i = 0; i < n; i++)
1230 {
1231 if (framebuffers[i] != 0)
1232 {
1233 context->deleteFramebuffer(framebuffers[i]);
1234 }
1235 }
1236 }
1237 }
1238 catch(std::bad_alloc&)
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 }
1242}
1243
1244void __stdcall glDeleteProgram(GLuint program)
1245{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001246 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247
1248 try
1249 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001250 if (program == 0)
1251 {
1252 return;
1253 }
1254
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256
1257 if (context)
1258 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001259 if (!context->getProgram(program))
1260 {
1261 if(context->getShader(program))
1262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001264 }
1265 else
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001268 }
1269 }
1270
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 context->deleteProgram(program);
1272 }
1273 }
1274 catch(std::bad_alloc&)
1275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 }
1278}
1279
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001280void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1281{
1282 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1283
1284 try
1285 {
1286 if (n < 0)
1287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001289 }
1290
1291 gl::Context *context = gl::getNonLostContext();
1292
1293 if (context)
1294 {
1295 for (int i = 0; i < n; i++)
1296 {
1297 context->deleteQuery(ids[i]);
1298 }
1299 }
1300 }
1301 catch(std::bad_alloc&)
1302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001304 }
1305}
1306
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1308{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001309 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310
1311 try
1312 {
1313 if (n < 0)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001316 }
1317
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001318 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319
1320 if (context)
1321 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001322 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 {
1324 context->deleteRenderbuffer(renderbuffers[i]);
1325 }
1326 }
1327 }
1328 catch(std::bad_alloc&)
1329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331 }
1332}
1333
1334void __stdcall glDeleteShader(GLuint shader)
1335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001336 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337
1338 try
1339 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001340 if (shader == 0)
1341 {
1342 return;
1343 }
1344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346
1347 if (context)
1348 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001349 if (!context->getShader(shader))
1350 {
1351 if(context->getProgram(shader))
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001354 }
1355 else
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001358 }
1359 }
1360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001361 context->deleteShader(shader);
1362 }
1363 }
1364 catch(std::bad_alloc&)
1365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 }
1368}
1369
1370void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001372 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 try
1375 {
1376 if (n < 0)
1377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001379 }
1380
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382
1383 if (context)
1384 {
1385 for (int i = 0; i < n; i++)
1386 {
1387 if (textures[i] != 0)
1388 {
1389 context->deleteTexture(textures[i]);
1390 }
1391 }
1392 }
1393 }
1394 catch(std::bad_alloc&)
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001397 }
1398}
1399
1400void __stdcall glDepthFunc(GLenum func)
1401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001402 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001403
1404 try
1405 {
1406 switch (func)
1407 {
1408 case GL_NEVER:
1409 case GL_ALWAYS:
1410 case GL_LESS:
1411 case GL_LEQUAL:
1412 case GL_EQUAL:
1413 case GL_GREATER:
1414 case GL_GEQUAL:
1415 case GL_NOTEQUAL:
1416 break;
1417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419 }
1420
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422
1423 if (context)
1424 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001425 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001426 }
1427 }
1428 catch(std::bad_alloc&)
1429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431 }
1432}
1433
1434void __stdcall glDepthMask(GLboolean flag)
1435{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001436 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437
1438 try
1439 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441
1442 if (context)
1443 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001444 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446 }
1447 catch(std::bad_alloc&)
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450 }
1451}
1452
1453void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001455 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001463 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465 }
1466 catch(std::bad_alloc&)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 }
1470}
1471
1472void __stdcall glDetachShader(GLuint program, GLuint shader)
1473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001474 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 try
1477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479
1480 if (context)
1481 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001482
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483 gl::Program *programObject = context->getProgram(program);
1484 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001485
1486 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001487 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488 gl::Shader *shaderByProgramHandle;
1489 shaderByProgramHandle = context->getShader(program);
1490 if (!shaderByProgramHandle)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001493 }
1494 else
1495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001497 }
1498 }
1499
1500 if (!shaderObject)
1501 {
1502 gl::Program *programByShaderHandle = context->getProgram(shader);
1503 if (!programByShaderHandle)
1504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001506 }
1507 else
1508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001510 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001511 }
1512
1513 if (!programObject->detachShader(shaderObject))
1514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
1518 }
1519 catch(std::bad_alloc&)
1520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
1523}
1524
1525void __stdcall glDisable(GLenum cap)
1526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001527 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528
1529 try
1530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001532
1533 if (context)
1534 {
Geoff Lang0550d032014-01-30 11:29:07 -05001535 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538 }
Geoff Lang0550d032014-01-30 11:29:07 -05001539
1540 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
1542 }
1543 catch(std::bad_alloc&)
1544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546 }
1547}
1548
1549void __stdcall glDisableVertexAttribArray(GLuint index)
1550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001551 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552
1553 try
1554 {
1555 if (index >= gl::MAX_VERTEX_ATTRIBS)
1556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558 }
1559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
1562 if (context)
1563 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001564 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565 }
1566 }
1567 catch(std::bad_alloc&)
1568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571}
1572
1573void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001575 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576
1577 try
1578 {
1579 if (count < 0 || first < 0)
1580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582 }
1583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
Jamie Madill7a5f7382014-03-05 15:01:24 -05001586 // Check for mapped buffers
1587 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1588 {
1589 return gl::error(GL_INVALID_OPERATION);
1590 }
1591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592 if (context)
1593 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001594 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1595 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1596 curTransformFeedback->getDrawMode() != mode)
1597 {
1598 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1599 // that does not match the current transform feedback object's draw mode (if transform feedback
1600 // is active), (3.0.2, section 2.14, pg 86)
1601 return gl::error(GL_INVALID_OPERATION);
1602 }
1603
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001604 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605 }
1606 }
1607 catch(std::bad_alloc&)
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001610 }
1611}
1612
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001613void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1614{
1615 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1616
1617 try
1618 {
1619 if (count < 0 || first < 0 || primcount < 0)
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001622 }
1623
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001624 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001625 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001626 gl::Context *context = gl::getNonLostContext();
1627
Jamie Madill7a5f7382014-03-05 15:01:24 -05001628 // Check for mapped buffers
1629 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1630 {
1631 return gl::error(GL_INVALID_OPERATION);
1632 }
1633
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001634 if (context)
1635 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001636 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1637 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1638 curTransformFeedback->getDrawMode() != mode)
1639 {
1640 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1641 // that does not match the current transform feedback object's draw mode (if transform feedback
1642 // is active), (3.0.2, section 2.14, pg 86)
1643 return gl::error(GL_INVALID_OPERATION);
1644 }
1645
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001646 context->drawArrays(mode, first, count, primcount);
1647 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001648 }
1649 }
1650 catch(std::bad_alloc&)
1651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001653 }
1654}
1655
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001656void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001658 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 +00001659 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660
1661 try
1662 {
1663 if (count < 0)
1664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666 }
1667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 if (context)
1671 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001672 switch (type)
1673 {
1674 case GL_UNSIGNED_BYTE:
1675 case GL_UNSIGNED_SHORT:
1676 break;
1677 case GL_UNSIGNED_INT:
1678 if (!context->supports32bitIndices())
1679 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001680 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001681 }
1682 break;
1683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001685 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001686
1687 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1688 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1689 {
1690 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1691 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1692 return gl::error(GL_INVALID_OPERATION);
1693 }
1694
Jamie Madill7a5f7382014-03-05 15:01:24 -05001695 // Check for mapped buffers
1696 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1697 {
1698 return gl::error(GL_INVALID_OPERATION);
1699 }
1700
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001701 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702 }
1703 }
1704 catch(std::bad_alloc&)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708}
1709
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001710void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1711{
1712 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1713 mode, count, type, indices, primcount);
1714
1715 try
1716 {
1717 if (count < 0 || primcount < 0)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001720 }
1721
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001722 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001723 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001724 gl::Context *context = gl::getNonLostContext();
1725
1726 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001727 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001728 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 case GL_UNSIGNED_BYTE:
1731 case GL_UNSIGNED_SHORT:
1732 break;
1733 case GL_UNSIGNED_INT:
1734 if (!context->supports32bitIndices())
1735 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001737 }
1738 break;
1739 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001741 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001742
1743 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1744 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1745 {
1746 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1747 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1748 return gl::error(GL_INVALID_OPERATION);
1749 }
1750
Jamie Madill7a5f7382014-03-05 15:01:24 -05001751 // Check for mapped buffers
1752 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1753 {
1754 return gl::error(GL_INVALID_OPERATION);
1755 }
1756
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001757 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001758 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
1760 }
1761 catch(std::bad_alloc&)
1762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764 }
1765}
1766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767void __stdcall glEnable(GLenum cap)
1768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001769 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774
1775 if (context)
1776 {
Geoff Lang0550d032014-01-30 11:29:07 -05001777 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780 }
Geoff Lang0550d032014-01-30 11:29:07 -05001781
1782 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783 }
1784 }
1785 catch(std::bad_alloc&)
1786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789}
1790
1791void __stdcall glEnableVertexAttribArray(GLuint index)
1792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001793 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794
1795 try
1796 {
1797 if (index >= gl::MAX_VERTEX_ATTRIBS)
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800 }
1801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 if (context)
1805 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001806 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 }
1808 }
1809 catch(std::bad_alloc&)
1810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813}
1814
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001815void __stdcall glEndQueryEXT(GLenum target)
1816{
1817 EVENT("GLenum target = 0x%X)", target);
1818
1819 try
1820 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001821 gl::Context *context = gl::getNonLostContext();
1822
1823 if (context)
1824 {
Geoff Lang37dde692014-01-31 16:34:54 -05001825 if (!ValidQueryType(context, target))
1826 {
1827 return gl::error(GL_INVALID_ENUM);
1828 }
1829
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001830 context->endQuery(target);
1831 }
1832 }
1833 catch(std::bad_alloc&)
1834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001836 }
1837}
1838
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001839void __stdcall glFinishFenceNV(GLuint fence)
1840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001841 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001842
1843 try
1844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001845 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001846
1847 if (context)
1848 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001849 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001850
1851 if (fenceObject == NULL)
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001854 }
1855
Jamie Madillfb9a7402013-07-26 11:55:01 -04001856 if (fenceObject->isFence() != GL_TRUE)
1857 {
1858 return gl::error(GL_INVALID_OPERATION);
1859 }
1860
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001861 fenceObject->finishFence();
1862 }
1863 }
1864 catch(std::bad_alloc&)
1865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001867 }
1868}
1869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870void __stdcall glFinish(void)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877
1878 if (context)
1879 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001880 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001881 }
1882 }
1883 catch(std::bad_alloc&)
1884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001885 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886 }
1887}
1888
1889void __stdcall glFlush(void)
1890{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001891 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892
1893 try
1894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
1897 if (context)
1898 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001899 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 }
1901 }
1902 catch(std::bad_alloc&)
1903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905 }
1906}
1907
1908void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001910 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001911 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912
1913 try
1914 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001915 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
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 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001924 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001925 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001926 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001928
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001929 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1930 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001932 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001934 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001935 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001936 }
1937 else
1938 {
1939 switch (attachment)
1940 {
1941 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001942 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001943 break;
1944 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001945 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001946 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001947 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1949 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001950 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001951 UNREACHABLE();
1952 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955 }
1956 }
1957 catch(std::bad_alloc&)
1958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961}
1962
1963void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001965 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001966 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 try
1969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 if (context)
1972 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001974 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001975 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001976 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001977 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001978
1979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001980 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001981 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001982 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001983 }
1984
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001985 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001987 textarget = GL_NONE;
1988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001990 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001992 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001993 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001994 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001995 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001996 }
1997 else
1998 {
1999 switch (attachment)
2000 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002001 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2002 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2003 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002004 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007 }
2008 catch(std::bad_alloc&)
2009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002010 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 }
2012}
2013
2014void __stdcall glFrontFace(GLenum mode)
2015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002016 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017
2018 try
2019 {
2020 switch (mode)
2021 {
2022 case GL_CW:
2023 case GL_CCW:
2024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026
2027 if (context)
2028 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002029 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030 }
2031 }
2032 break;
2033 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002034 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036 }
2037 catch(std::bad_alloc&)
2038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041}
2042
2043void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002045 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046
2047 try
2048 {
2049 if (n < 0)
2050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 }
2053
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002054 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055
2056 if (context)
2057 {
2058 for (int i = 0; i < n; i++)
2059 {
2060 buffers[i] = context->createBuffer();
2061 }
2062 }
2063 }
2064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070void __stdcall glGenerateMipmap(GLenum target)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073
2074 try
2075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002077
2078 if (context)
2079 {
Jamie Madill35d15012013-10-07 10:46:37 -04002080 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002082 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002083 }
Geoff Langae4852a2013-06-05 15:00:34 -04002084
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002085 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002086
2087 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002088 {
2089 return gl::error(GL_INVALID_OPERATION);
2090 }
2091
Geoff Lang005df412013-10-16 14:12:50 -04002092 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002093
Geoff Langae4852a2013-06-05 15:00:34 -04002094 // Internally, all texture formats are sized so checking if the format
2095 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002096
2097 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2098 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2099
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002100 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2101 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002102 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2103 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002104 {
2105 return gl::error(GL_INVALID_OPERATION);
2106 }
2107
Jamie Madillc1f8b162013-10-07 10:46:38 -04002108 // Non-power of 2 ES2 check
2109 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2110 {
2111 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2112 return gl::error(GL_INVALID_OPERATION);
2113 }
2114
2115 // Cube completeness check
2116 if (target == GL_TEXTURE_CUBE_MAP)
2117 {
2118 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2119 if (!textureCube->isCubeComplete())
2120 {
2121 return gl::error(GL_INVALID_OPERATION);
2122 }
2123 }
2124
Geoff Langae4852a2013-06-05 15:00:34 -04002125 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002126 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127 }
2128 catch(std::bad_alloc&)
2129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002131 }
2132}
2133
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002134void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002136 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002137
2138 try
2139 {
2140 if (n < 0)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002143 }
2144
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002145 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002146
2147 if (context)
2148 {
2149 for (int i = 0; i < n; i++)
2150 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002151 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002152 }
2153 }
2154 }
2155 catch(std::bad_alloc&)
2156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002158 }
2159}
2160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002163 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164
2165 try
2166 {
2167 if (n < 0)
2168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173
2174 if (context)
2175 {
2176 for (int i = 0; i < n; i++)
2177 {
2178 framebuffers[i] = context->createFramebuffer();
2179 }
2180 }
2181 }
2182 catch(std::bad_alloc&)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002188void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2189{
2190 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2191
2192 try
2193 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002194 gl::Context *context = gl::getNonLostContext();
2195
2196 if (context)
2197 {
Geoff Lang37dde692014-01-31 16:34:54 -05002198 if (n < 0)
2199 {
2200 return gl::error(GL_INVALID_VALUE);
2201 }
2202
2203 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002204 {
2205 ids[i] = context->createQuery();
2206 }
2207 }
2208 }
2209 catch(std::bad_alloc&)
2210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002212 }
2213}
2214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002217 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218
2219 try
2220 {
2221 if (n < 0)
2222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002224 }
2225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227
2228 if (context)
2229 {
2230 for (int i = 0; i < n; i++)
2231 {
2232 renderbuffers[i] = context->createRenderbuffer();
2233 }
2234 }
2235 }
2236 catch(std::bad_alloc&)
2237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239 }
2240}
2241
2242void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2243{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002244 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 try
2247 {
2248 if (n < 0)
2249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251 }
2252
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002253 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254
2255 if (context)
2256 {
2257 for (int i = 0; i < n; i++)
2258 {
2259 textures[i] = context->createTexture();
2260 }
2261 }
2262 }
2263 catch(std::bad_alloc&)
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267}
2268
daniel@transgaming.com85423182010-04-22 13:35:27 +00002269void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002271 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002272 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002273 program, index, bufsize, length, size, type, name);
2274
2275 try
2276 {
2277 if (bufsize < 0)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002283
2284 if (context)
2285 {
2286 gl::Program *programObject = context->getProgram(program);
2287
2288 if (!programObject)
2289 {
2290 if (context->getShader(program))
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002293 }
2294 else
2295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002297 }
2298 }
2299
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002300 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002303 }
2304
2305 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2306 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307 }
2308 catch(std::bad_alloc&)
2309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 }
2312}
2313
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002314void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002316 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002317 "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 +00002318 program, index, bufsize, length, size, type, name);
2319
2320 try
2321 {
2322 if (bufsize < 0)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002328
2329 if (context)
2330 {
2331 gl::Program *programObject = context->getProgram(program);
2332
2333 if (!programObject)
2334 {
2335 if (context->getShader(program))
2336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002338 }
2339 else
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002342 }
2343 }
2344
2345 if (index >= (GLuint)programObject->getActiveUniformCount())
2346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002348 }
2349
2350 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2351 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 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 +00002362 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (maxcount < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002372
2373 if (context)
2374 {
2375 gl::Program *programObject = context->getProgram(program);
2376
2377 if (!programObject)
2378 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002379 if (context->getShader(program))
2380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002382 }
2383 else
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002386 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002387 }
2388
2389 return programObject->getAttachedShaders(maxcount, count, shaders);
2390 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392 catch(std::bad_alloc&)
2393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002394 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395 }
2396}
2397
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002398int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002400 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401
2402 try
2403 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405
2406 if (context)
2407 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409 gl::Program *programObject = context->getProgram(program);
2410
2411 if (!programObject)
2412 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002413 if (context->getShader(program))
2414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002415 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002416 }
2417 else
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421 }
2422
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002423 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002424 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002426 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002427 }
2428
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002429 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
2431 }
2432 catch(std::bad_alloc&)
2433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002434 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 }
2436
2437 return -1;
2438}
2439
2440void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002442 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443
2444 try
2445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002447
2448 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002450 GLenum nativeType;
2451 unsigned int numParams = 0;
2452 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2453 return gl::error(GL_INVALID_ENUM);
2454
2455 // pname is valid, but there are no parameters to return
2456 if (numParams == 0)
2457 return;
2458
2459 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002460 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002461 context->getBooleanv(pname, params);
2462 }
Jamie Madill55856b12014-01-02 13:59:50 -05002463 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002464 {
Jamie Madill55856b12014-01-02 13:59:50 -05002465 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468 }
2469 catch(std::bad_alloc&)
2470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 }
2473}
2474
2475void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002477 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 +00002478
2479 try
2480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002482
2483 if (context)
2484 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002485 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002486 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002487 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002488 }
2489
Jamie Madill70656a62014-03-05 15:01:26 -05002490 if (!gl::ValidBufferParameter(context, pname))
2491 {
2492 return gl::error(GL_INVALID_ENUM);
2493 }
2494
Jamie Madill8c96d582014-03-05 15:01:23 -05002495 gl::Buffer *buffer = context->getTargetBuffer(target);
2496
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002497 if (!buffer)
2498 {
2499 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002501 }
2502
2503 switch (pname)
2504 {
2505 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002506 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002507 break;
2508 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002509 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002510 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002511 case GL_BUFFER_ACCESS_FLAGS:
2512 *params = buffer->accessFlags();
2513 break;
2514 case GL_BUFFER_MAPPED:
2515 *params = static_cast<GLint>(buffer->mapped());
2516 break;
2517 case GL_BUFFER_MAP_OFFSET:
2518 *params = gl::clampCast<GLint>(buffer->mapOffset());
2519 break;
2520 case GL_BUFFER_MAP_LENGTH:
2521 *params = gl::clampCast<GLint>(buffer->mapLength());
2522 break;
2523 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002524 }
2525 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527 catch(std::bad_alloc&)
2528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002530 }
2531}
2532
2533GLenum __stdcall glGetError(void)
2534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002535 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536
2537 gl::Context *context = gl::getContext();
2538
2539 if (context)
2540 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002541 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542 }
2543
2544 return GL_NO_ERROR;
2545}
2546
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002547void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002549 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002550
2551 try
2552 {
2553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002554 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002555
2556 if (context)
2557 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002558 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002559
2560 if (fenceObject == NULL)
2561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002562 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002563 }
2564
Jamie Madillfb9a7402013-07-26 11:55:01 -04002565 if (fenceObject->isFence() != GL_TRUE)
2566 {
2567 return gl::error(GL_INVALID_OPERATION);
2568 }
2569
2570 switch (pname)
2571 {
2572 case GL_FENCE_STATUS_NV:
2573 case GL_FENCE_CONDITION_NV:
2574 break;
2575
2576 default: return gl::error(GL_INVALID_ENUM);
2577 }
2578
2579 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002580 }
2581 }
2582 catch(std::bad_alloc&)
2583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002584 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002585 }
2586}
2587
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002590 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591
2592 try
2593 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002595
2596 if (context)
2597 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002598 GLenum nativeType;
2599 unsigned int numParams = 0;
2600 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2601 return gl::error(GL_INVALID_ENUM);
2602
2603 // pname is valid, but that there are no parameters to return.
2604 if (numParams == 0)
2605 return;
2606
2607 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002608 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002609 context->getFloatv(pname, params);
2610 }
Jamie Madill55856b12014-01-02 13:59:50 -05002611 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002612 {
Jamie Madill55856b12014-01-02 13:59:50 -05002613 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002614 }
2615 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002616 }
2617 catch(std::bad_alloc&)
2618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620 }
2621}
2622
2623void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002625 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 +00002626 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627
2628 try
2629 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631
2632 if (context)
2633 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002634 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002636 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002637 }
2638
Geoff Lang646559f2013-08-15 11:08:15 -04002639 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002640 {
Geoff Lang646559f2013-08-15 11:08:15 -04002641 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2642 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2643 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2644 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2645 break;
2646 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2647 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2651 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2652 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2653 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2654 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2655 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002656 {
Geoff Lang646559f2013-08-15 11:08:15 -04002657 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002658 }
Geoff Lang646559f2013-08-15 11:08:15 -04002659 default:
2660 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002661 }
Geoff Lang646559f2013-08-15 11:08:15 -04002662
2663 // Determine if the attachment is a valid enum
2664 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002665 {
Geoff Lang646559f2013-08-15 11:08:15 -04002666 case GL_BACK:
2667 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002668 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002669 case GL_STENCIL:
2670 case GL_DEPTH_STENCIL_ATTACHMENT:
2671 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002672 {
Geoff Lang646559f2013-08-15 11:08:15 -04002673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002674 }
Geoff Lang646559f2013-08-15 11:08:15 -04002675 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002676
Geoff Lang646559f2013-08-15 11:08:15 -04002677 case GL_DEPTH_ATTACHMENT:
2678 case GL_STENCIL_ATTACHMENT:
2679 break;
2680
2681 default:
2682 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2683 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2684 {
2685 return gl::error(GL_INVALID_ENUM);
2686 }
2687 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002688 }
2689
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002690 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2691 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002692 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2693
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002694 GLenum attachmentType;
2695 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002696 GLuint attachmentLevel;
2697 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002698 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002699
Geoff Lang646559f2013-08-15 11:08:15 -04002700 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701 {
Geoff Lang646559f2013-08-15 11:08:15 -04002702 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002703 {
Geoff Lang646559f2013-08-15 11:08:15 -04002704 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002705 }
2706
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002707 switch (attachment)
2708 {
Geoff Lang646559f2013-08-15 11:08:15 -04002709 case GL_BACK:
2710 attachmentType = framebuffer->getColorbufferType(0);
2711 attachmentHandle = framebuffer->getColorbufferHandle(0);
2712 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2713 attachmentLayer = framebuffer->getColorbufferLayer(0);
2714 renderbuffer = framebuffer->getColorbuffer(0);
2715 break;
2716 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002717 attachmentType = framebuffer->getDepthbufferType();
2718 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002719 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2720 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002721 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002722 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002723 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002724 attachmentType = framebuffer->getStencilbufferType();
2725 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002726 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2727 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002728 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002729 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002730 default:
2731 return gl::error(GL_INVALID_OPERATION);
2732 }
2733 }
2734 else
2735 {
2736 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2737 {
2738 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2739 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2740 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2741 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2742 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2743 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2744 }
2745 else
2746 {
2747 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002748 {
Geoff Lang646559f2013-08-15 11:08:15 -04002749 case GL_DEPTH_ATTACHMENT:
2750 attachmentType = framebuffer->getDepthbufferType();
2751 attachmentHandle = framebuffer->getDepthbufferHandle();
2752 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2753 attachmentLayer = framebuffer->getDepthbufferLayer();
2754 renderbuffer = framebuffer->getDepthbuffer();
2755 break;
2756 case GL_STENCIL_ATTACHMENT:
2757 attachmentType = framebuffer->getStencilbufferType();
2758 attachmentHandle = framebuffer->getStencilbufferHandle();
2759 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2760 attachmentLayer = framebuffer->getStencilbufferLayer();
2761 renderbuffer = framebuffer->getStencilbuffer();
2762 break;
2763 case GL_DEPTH_STENCIL_ATTACHMENT:
2764 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2765 {
2766 return gl::error(GL_INVALID_OPERATION);
2767 }
2768 attachmentType = framebuffer->getDepthStencilbufferType();
2769 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2770 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2771 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2772 renderbuffer = framebuffer->getDepthStencilBuffer();
2773 break;
2774 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002775 return gl::error(GL_INVALID_OPERATION);
2776 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002777 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002778 }
2779
2780 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002781 if (framebufferHandle == 0)
2782 {
2783 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2784 }
2785 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002786 {
2787 attachmentObjectType = attachmentType;
2788 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002789 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002790 {
2791 attachmentObjectType = GL_TEXTURE;
2792 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002793 else
2794 {
2795 UNREACHABLE();
2796 return;
2797 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002798
Geoff Lang646559f2013-08-15 11:08:15 -04002799 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002800 {
Geoff Lang646559f2013-08-15 11:08:15 -04002801 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2802 // is NONE, then querying any other pname will generate INVALID_ENUM.
2803
2804 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2805 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2806 // INVALID_OPERATION for all other pnames
2807
2808 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002809 {
Geoff Lang646559f2013-08-15 11:08:15 -04002810 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2811 *params = attachmentObjectType;
2812 break;
2813
2814 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2815 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002816 {
Geoff Lang646559f2013-08-15 11:08:15 -04002817 return gl::error(GL_INVALID_ENUM);
2818 }
2819 *params = 0;
2820 break;
2821
2822 default:
2823 if (context->getClientVersion() < 3)
2824 {
2825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002826 }
2827 else
2828 {
Geoff Lang646559f2013-08-15 11:08:15 -04002829 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002830 }
2831 }
Geoff Lang646559f2013-08-15 11:08:15 -04002832 }
2833 else
2834 {
2835 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2836 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2837 ASSERT(renderbuffer != NULL);
2838
2839 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002840 {
Geoff Lang646559f2013-08-15 11:08:15 -04002841 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2842 *params = attachmentObjectType;
2843 break;
2844
2845 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2846 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2847 {
2848 return gl::error(GL_INVALID_ENUM);
2849 }
2850 *params = attachmentHandle;
2851 break;
2852
2853 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2854 if (attachmentObjectType != GL_TEXTURE)
2855 {
2856 return gl::error(GL_INVALID_ENUM);
2857 }
2858 *params = attachmentLevel;
2859 break;
2860
2861 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2862 if (attachmentObjectType != GL_TEXTURE)
2863 {
2864 return gl::error(GL_INVALID_ENUM);
2865 }
2866 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2867 break;
2868
2869 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2870 *params = renderbuffer->getRedSize();
2871 break;
2872
2873 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2874 *params = renderbuffer->getGreenSize();
2875 break;
2876
2877 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2878 *params = renderbuffer->getBlueSize();
2879 break;
2880
2881 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2882 *params = renderbuffer->getAlphaSize();
2883 break;
2884
2885 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2886 *params = renderbuffer->getDepthSize();
2887 break;
2888
2889 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2890 *params = renderbuffer->getStencilSize();
2891 break;
2892
2893 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2894 if (attachment == GL_DEPTH_STENCIL)
2895 {
2896 gl::error(GL_INVALID_OPERATION);
2897 }
2898 *params = renderbuffer->getComponentType();
2899 break;
2900
2901 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2902 *params = renderbuffer->getColorEncoding();
2903 break;
2904
2905 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2906 if (attachmentObjectType != GL_TEXTURE)
2907 {
2908 return gl::error(GL_INVALID_ENUM);
2909 }
2910 *params = attachmentLayer;
2911 break;
2912
2913 default:
2914 UNREACHABLE();
2915 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002916 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919 }
2920 catch(std::bad_alloc&)
2921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002922 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002923 }
2924}
2925
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002926GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2927{
2928 EVENT("()");
2929
2930 try
2931 {
2932 gl::Context *context = gl::getContext();
2933
2934 if (context)
2935 {
2936 return context->getResetStatus();
2937 }
2938
2939 return GL_NO_ERROR;
2940 }
2941 catch(std::bad_alloc&)
2942 {
2943 return GL_OUT_OF_MEMORY;
2944 }
2945}
2946
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002949 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002950
2951 try
2952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954
2955 if (context)
2956 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002957 GLenum nativeType;
2958 unsigned int numParams = 0;
2959 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2960 return gl::error(GL_INVALID_ENUM);
2961
2962 // pname is valid, but there are no parameters to return
2963 if (numParams == 0)
2964 return;
2965
2966 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002968 context->getIntegerv(pname, params);
2969 }
Jamie Madill55856b12014-01-02 13:59:50 -05002970 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002971 {
Jamie Madill55856b12014-01-02 13:59:50 -05002972 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 }
2974 }
2975 }
2976 catch(std::bad_alloc&)
2977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 }
2980}
2981
2982void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2983{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002984 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985
2986 try
2987 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989
2990 if (context)
2991 {
2992 gl::Program *programObject = context->getProgram(program);
2993
2994 if (!programObject)
2995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997 }
2998
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002999 if (context->getClientVersion() < 3)
3000 {
3001 switch (pname)
3002 {
3003 case GL_ACTIVE_UNIFORM_BLOCKS:
3004 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003005 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3006 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3007 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003008 return gl::error(GL_INVALID_ENUM);
3009 }
3010 }
3011
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 switch (pname)
3013 {
3014 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003015 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 return;
3017 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003018 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 return;
3020 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003021 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022 return;
3023 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003024 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 return;
3026 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003027 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 return;
3029 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003030 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 return;
3032 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003033 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 return;
3035 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003036 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 return;
3038 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003039 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003041 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003042 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003043 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003044 case GL_ACTIVE_UNIFORM_BLOCKS:
3045 *params = programObject->getActiveUniformBlockCount();
3046 return;
3047 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3048 *params = programObject->getActiveUniformBlockMaxLength();
3049 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003050 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3051 *params = programObject->getTransformFeedbackBufferMode();
3052 break;
3053 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3054 *params = programObject->getTransformFeedbackVaryingCount();
3055 break;
3056 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3057 *params = programObject->getTransformFeedbackVaryingMaxLength();
3058 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 }
3062 }
3063 }
3064 catch(std::bad_alloc&)
3065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 }
3068}
3069
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003070void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003072 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 +00003073 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003074
3075 try
3076 {
3077 if (bufsize < 0)
3078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080 }
3081
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003083
3084 if (context)
3085 {
3086 gl::Program *programObject = context->getProgram(program);
3087
3088 if (!programObject)
3089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003091 }
3092
3093 programObject->getInfoLog(bufsize, length, infolog);
3094 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003095 }
3096 catch(std::bad_alloc&)
3097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 }
3100}
3101
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003102void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3103{
3104 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3105
3106 try
3107 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003108 gl::Context *context = gl::getNonLostContext();
3109
3110 if (context)
3111 {
Geoff Lang37dde692014-01-31 16:34:54 -05003112 if (!ValidQueryType(context, target))
3113 {
3114 return gl::error(GL_INVALID_ENUM);
3115 }
3116
3117 switch (pname)
3118 {
3119 case GL_CURRENT_QUERY_EXT:
3120 params[0] = context->getActiveQuery(target);
3121 break;
3122
3123 default:
3124 return gl::error(GL_INVALID_ENUM);
3125 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003126 }
3127 }
3128 catch(std::bad_alloc&)
3129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003131 }
3132}
3133
3134void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3135{
3136 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3137
3138 try
3139 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140 gl::Context *context = gl::getNonLostContext();
3141
3142 if (context)
3143 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003144 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3145
3146 if (!queryObject)
3147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003148 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003149 }
3150
3151 if (context->getActiveQuery(queryObject->getType()) == id)
3152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003153 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003154 }
3155
3156 switch(pname)
3157 {
3158 case GL_QUERY_RESULT_EXT:
3159 params[0] = queryObject->getResult();
3160 break;
3161 case GL_QUERY_RESULT_AVAILABLE_EXT:
3162 params[0] = queryObject->isResultAvailable();
3163 break;
3164 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003165 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003166 }
3167 }
3168 }
3169 catch(std::bad_alloc&)
3170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003171 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003172 }
3173}
3174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003175void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3176{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003177 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 +00003178
3179 try
3180 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003182
3183 if (context)
3184 {
3185 if (target != GL_RENDERBUFFER)
3186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003187 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003188 }
3189
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003190 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003193 }
3194
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003195 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003196
3197 switch (pname)
3198 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003199 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3200 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3201 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3202 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3203 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3204 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3205 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3206 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3207 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003208 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003209 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003210 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003211 *params = renderbuffer->getSamples();
3212 }
3213 else
3214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003216 }
3217 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003220 }
3221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 }
3223 catch(std::bad_alloc&)
3224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 }
3227}
3228
3229void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003231 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232
3233 try
3234 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003235 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236
3237 if (context)
3238 {
3239 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003240
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241 if (!shaderObject)
3242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003243 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003244 }
3245
3246 switch (pname)
3247 {
3248 case GL_SHADER_TYPE:
3249 *params = shaderObject->getType();
3250 return;
3251 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003252 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253 return;
3254 case GL_COMPILE_STATUS:
3255 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3256 return;
3257 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003258 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 return;
3260 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003261 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003263 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3264 *params = shaderObject->getTranslatedSourceLength();
3265 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 }
3269 }
3270 }
3271 catch(std::bad_alloc&)
3272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275}
3276
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003277void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003279 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 +00003280 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281
3282 try
3283 {
3284 if (bufsize < 0)
3285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287 }
3288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003290
3291 if (context)
3292 {
3293 gl::Shader *shaderObject = context->getShader(shader);
3294
3295 if (!shaderObject)
3296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003298 }
3299
3300 shaderObject->getInfoLog(bufsize, length, infolog);
3301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302 }
3303 catch(std::bad_alloc&)
3304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 }
3307}
3308
3309void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003311 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 +00003312 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313
3314 try
3315 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003316 switch (shadertype)
3317 {
3318 case GL_VERTEX_SHADER:
3319 case GL_FRAGMENT_SHADER:
3320 break;
3321 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003322 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003323 }
3324
3325 switch (precisiontype)
3326 {
3327 case GL_LOW_FLOAT:
3328 case GL_MEDIUM_FLOAT:
3329 case GL_HIGH_FLOAT:
3330 // Assume IEEE 754 precision
3331 range[0] = 127;
3332 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003333 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003334 break;
3335 case GL_LOW_INT:
3336 case GL_MEDIUM_INT:
3337 case GL_HIGH_INT:
3338 // Some (most) hardware only supports single-precision floating-point numbers,
3339 // which can accurately represent integers up to +/-16777216
3340 range[0] = 24;
3341 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003342 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003343 break;
3344 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003345 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003346 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 }
3348 catch(std::bad_alloc&)
3349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
3352}
3353
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003354void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003356 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 +00003357 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358
3359 try
3360 {
3361 if (bufsize < 0)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003366 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003367
3368 if (context)
3369 {
3370 gl::Shader *shaderObject = context->getShader(shader);
3371
3372 if (!shaderObject)
3373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003374 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003375 }
3376
3377 shaderObject->getSource(bufsize, length, source);
3378 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 }
3380 catch(std::bad_alloc&)
3381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003382 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003383 }
3384}
3385
zmo@google.coma574f782011-10-03 21:45:23 +00003386void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3387{
3388 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3389 shader, bufsize, length, source);
3390
3391 try
3392 {
3393 if (bufsize < 0)
3394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003395 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003396 }
3397
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003398 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003399
3400 if (context)
3401 {
3402 gl::Shader *shaderObject = context->getShader(shader);
3403
3404 if (!shaderObject)
3405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003406 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003407 }
3408
3409 shaderObject->getTranslatedSource(bufsize, length, source);
3410 }
3411 }
3412 catch(std::bad_alloc&)
3413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003414 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003415 }
3416}
3417
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418const GLubyte* __stdcall glGetString(GLenum name)
3419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003420 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421
3422 try
3423 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003425
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 switch (name)
3427 {
3428 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003429 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003431 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003433 if (context->getClientVersion() == 2)
3434 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003435 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003436 }
3437 else
3438 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003439 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003440 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 if (context->getClientVersion() == 2)
3443 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003444 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003445 }
3446 else
3447 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003448 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003451 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 }
3455 }
3456 catch(std::bad_alloc&)
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460}
3461
3462void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003464 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 +00003465
3466 try
3467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003469
3470 if (context)
3471 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003472 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003473
Jamie Madillfb8a8302013-07-03 14:24:12 -04003474 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003477 }
3478
3479 switch (pname)
3480 {
3481 case GL_TEXTURE_MAG_FILTER:
3482 *params = (GLfloat)texture->getMagFilter();
3483 break;
3484 case GL_TEXTURE_MIN_FILTER:
3485 *params = (GLfloat)texture->getMinFilter();
3486 break;
3487 case GL_TEXTURE_WRAP_S:
3488 *params = (GLfloat)texture->getWrapS();
3489 break;
3490 case GL_TEXTURE_WRAP_T:
3491 *params = (GLfloat)texture->getWrapT();
3492 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003493 case GL_TEXTURE_WRAP_R:
3494 if (context->getClientVersion() < 3)
3495 {
3496 return gl::error(GL_INVALID_ENUM);
3497 }
3498 *params = (GLfloat)texture->getWrapR();
3499 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003500 case GL_TEXTURE_IMMUTABLE_FORMAT:
3501 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003502 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3503 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003504 case GL_TEXTURE_IMMUTABLE_LEVELS:
3505 if (context->getClientVersion() < 3)
3506 {
3507 return gl::error(GL_INVALID_ENUM);
3508 }
Jamie Madill51a94372013-10-24 17:49:43 -04003509 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003510 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003511 case GL_TEXTURE_USAGE_ANGLE:
3512 *params = (GLfloat)texture->getUsage();
3513 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003514 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3515 if (!context->supportsTextureFilterAnisotropy())
3516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003517 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003518 }
3519 *params = (GLfloat)texture->getMaxAnisotropy();
3520 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003521 case GL_TEXTURE_SWIZZLE_R:
3522 if (context->getClientVersion() < 3)
3523 {
3524 return gl::error(GL_INVALID_ENUM);
3525 }
3526 *params = (GLfloat)texture->getSwizzleRed();
3527 break;
3528 case GL_TEXTURE_SWIZZLE_G:
3529 if (context->getClientVersion() < 3)
3530 {
3531 return gl::error(GL_INVALID_ENUM);
3532 }
3533 *params = (GLfloat)texture->getSwizzleGreen();
3534 break;
3535 case GL_TEXTURE_SWIZZLE_B:
3536 if (context->getClientVersion() < 3)
3537 {
3538 return gl::error(GL_INVALID_ENUM);
3539 }
3540 *params = (GLfloat)texture->getSwizzleBlue();
3541 break;
3542 case GL_TEXTURE_SWIZZLE_A:
3543 if (context->getClientVersion() < 3)
3544 {
3545 return gl::error(GL_INVALID_ENUM);
3546 }
3547 *params = (GLfloat)texture->getSwizzleAlpha();
3548 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003549 case GL_TEXTURE_BASE_LEVEL:
3550 if (context->getClientVersion() < 3)
3551 {
3552 return gl::error(GL_INVALID_ENUM);
3553 }
3554 *params = (GLfloat)texture->getBaseLevel();
3555 break;
3556 case GL_TEXTURE_MAX_LEVEL:
3557 if (context->getClientVersion() < 3)
3558 {
3559 return gl::error(GL_INVALID_ENUM);
3560 }
3561 *params = (GLfloat)texture->getMaxLevel();
3562 break;
3563 case GL_TEXTURE_MIN_LOD:
3564 if (context->getClientVersion() < 3)
3565 {
3566 return gl::error(GL_INVALID_ENUM);
3567 }
3568 *params = texture->getMinLod();
3569 break;
3570 case GL_TEXTURE_MAX_LOD:
3571 if (context->getClientVersion() < 3)
3572 {
3573 return gl::error(GL_INVALID_ENUM);
3574 }
3575 *params = texture->getMaxLod();
3576 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003577 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003579 }
3580 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003581 }
3582 catch(std::bad_alloc&)
3583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003584 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003585 }
3586}
3587
3588void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003590 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 +00003591
3592 try
3593 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003595
3596 if (context)
3597 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003598 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003599
Jamie Madillfb8a8302013-07-03 14:24:12 -04003600 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003602 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003603 }
3604
3605 switch (pname)
3606 {
3607 case GL_TEXTURE_MAG_FILTER:
3608 *params = texture->getMagFilter();
3609 break;
3610 case GL_TEXTURE_MIN_FILTER:
3611 *params = texture->getMinFilter();
3612 break;
3613 case GL_TEXTURE_WRAP_S:
3614 *params = texture->getWrapS();
3615 break;
3616 case GL_TEXTURE_WRAP_T:
3617 *params = texture->getWrapT();
3618 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003619 case GL_TEXTURE_WRAP_R:
3620 if (context->getClientVersion() < 3)
3621 {
3622 return gl::error(GL_INVALID_ENUM);
3623 }
3624 *params = texture->getWrapR();
3625 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003626 case GL_TEXTURE_IMMUTABLE_FORMAT:
3627 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003628 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3629 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003630 case GL_TEXTURE_IMMUTABLE_LEVELS:
3631 if (context->getClientVersion() < 3)
3632 {
3633 return gl::error(GL_INVALID_ENUM);
3634 }
Jamie Madill51a94372013-10-24 17:49:43 -04003635 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003636 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003637 case GL_TEXTURE_USAGE_ANGLE:
3638 *params = texture->getUsage();
3639 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003640 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3641 if (!context->supportsTextureFilterAnisotropy())
3642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003643 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003644 }
3645 *params = (GLint)texture->getMaxAnisotropy();
3646 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003647 case GL_TEXTURE_SWIZZLE_R:
3648 if (context->getClientVersion() < 3)
3649 {
3650 return gl::error(GL_INVALID_ENUM);
3651 }
3652 *params = texture->getSwizzleRed();
3653 break;
3654 case GL_TEXTURE_SWIZZLE_G:
3655 if (context->getClientVersion() < 3)
3656 {
3657 return gl::error(GL_INVALID_ENUM);
3658 }
3659 *params = texture->getSwizzleGreen();
3660 break;
3661 case GL_TEXTURE_SWIZZLE_B:
3662 if (context->getClientVersion() < 3)
3663 {
3664 return gl::error(GL_INVALID_ENUM);
3665 }
3666 *params = texture->getSwizzleBlue();
3667 break;
3668 case GL_TEXTURE_SWIZZLE_A:
3669 if (context->getClientVersion() < 3)
3670 {
3671 return gl::error(GL_INVALID_ENUM);
3672 }
3673 *params = texture->getSwizzleAlpha();
3674 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003675 case GL_TEXTURE_BASE_LEVEL:
3676 if (context->getClientVersion() < 3)
3677 {
3678 return gl::error(GL_INVALID_ENUM);
3679 }
3680 *params = texture->getBaseLevel();
3681 break;
3682 case GL_TEXTURE_MAX_LEVEL:
3683 if (context->getClientVersion() < 3)
3684 {
3685 return gl::error(GL_INVALID_ENUM);
3686 }
3687 *params = texture->getMaxLevel();
3688 break;
3689 case GL_TEXTURE_MIN_LOD:
3690 if (context->getClientVersion() < 3)
3691 {
3692 return gl::error(GL_INVALID_ENUM);
3693 }
3694 *params = (GLint)texture->getMinLod();
3695 break;
3696 case GL_TEXTURE_MAX_LOD:
3697 if (context->getClientVersion() < 3)
3698 {
3699 return gl::error(GL_INVALID_ENUM);
3700 }
3701 *params = (GLint)texture->getMaxLod();
3702 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003703 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003705 }
3706 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 }
3708 catch(std::bad_alloc&)
3709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003711 }
3712}
3713
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003714void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3715{
3716 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3717 program, location, bufSize, params);
3718
3719 try
3720 {
3721 if (bufSize < 0)
3722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003723 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003724 }
3725
3726 gl::Context *context = gl::getNonLostContext();
3727
3728 if (context)
3729 {
3730 if (program == 0)
3731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003732 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003733 }
3734
3735 gl::Program *programObject = context->getProgram(program);
3736
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003737 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003739 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003740 }
3741
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003742 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3743 if (!programBinary)
3744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003745 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003746 }
3747
3748 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003751 }
3752 }
3753 }
3754 catch(std::bad_alloc&)
3755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003757 }
3758}
3759
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3761{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003762 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003763
3764 try
3765 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003766 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003767
3768 if (context)
3769 {
3770 if (program == 0)
3771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003773 }
3774
3775 gl::Program *programObject = context->getProgram(program);
3776
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003777 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003780 }
3781
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003782 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3783 if (!programBinary)
3784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003785 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003786 }
3787
3788 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003790 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003791 }
3792 }
3793 }
3794 catch(std::bad_alloc&)
3795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003797 }
3798}
3799
3800void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3801{
3802 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3803 program, location, bufSize, params);
3804
3805 try
3806 {
3807 if (bufSize < 0)
3808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003809 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003810 }
3811
3812 gl::Context *context = gl::getNonLostContext();
3813
3814 if (context)
3815 {
3816 if (program == 0)
3817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003819 }
3820
3821 gl::Program *programObject = context->getProgram(program);
3822
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003823 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003826 }
3827
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003828 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3829 if (!programBinary)
3830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003831 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003832 }
3833
3834 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003836 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003837 }
3838 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003839 }
3840 catch(std::bad_alloc&)
3841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003842 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003843 }
3844}
3845
3846void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3847{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003848 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003849
3850 try
3851 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003853
3854 if (context)
3855 {
3856 if (program == 0)
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003859 }
3860
3861 gl::Program *programObject = context->getProgram(program);
3862
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003863 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003865 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003866 }
3867
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003868 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3869 if (!programBinary)
3870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003872 }
3873
3874 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003876 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003877 }
3878 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003879 }
3880 catch(std::bad_alloc&)
3881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003882 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003883 }
3884}
3885
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003886int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003888 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889
3890 try
3891 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003892 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893
3894 if (strstr(name, "gl_") == name)
3895 {
3896 return -1;
3897 }
3898
3899 if (context)
3900 {
3901 gl::Program *programObject = context->getProgram(program);
3902
3903 if (!programObject)
3904 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003905 if (context->getShader(program))
3906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003907 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003908 }
3909 else
3910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003911 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003912 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003913 }
3914
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003915 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003916 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003918 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003919 }
3920
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003921 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922 }
3923 }
3924 catch(std::bad_alloc&)
3925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003926 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003927 }
3928
3929 return -1;
3930}
3931
3932void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003934 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003935
3936 try
3937 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003938 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939
daniel@transgaming.come0078962010-04-15 20:45:08 +00003940 if (context)
3941 {
3942 if (index >= gl::MAX_VERTEX_ATTRIBS)
3943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003945 }
3946
daniel@transgaming.com83921382011-01-08 05:46:00 +00003947 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003948
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003949 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003950 {
Jamie Madillaff71502013-07-02 11:57:05 -04003951 return;
3952 }
3953
3954 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3955 {
3956 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3957 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003958 {
Jamie Madillaff71502013-07-02 11:57:05 -04003959 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003960 }
Jamie Madillaff71502013-07-02 11:57:05 -04003961 }
3962 else
3963 {
3964 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003965 }
3966 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 }
3968 catch(std::bad_alloc&)
3969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003970 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003971 }
3972}
3973
3974void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3975{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003976 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977
3978 try
3979 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003980 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981
daniel@transgaming.come0078962010-04-15 20:45:08 +00003982 if (context)
3983 {
3984 if (index >= gl::MAX_VERTEX_ATTRIBS)
3985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003986 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003987 }
3988
daniel@transgaming.com83921382011-01-08 05:46:00 +00003989 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003990
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003991 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003992 {
Jamie Madillaff71502013-07-02 11:57:05 -04003993 return;
3994 }
3995
3996 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3997 {
3998 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3999 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004000 {
Jamie Madillaff71502013-07-02 11:57:05 -04004001 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004002 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004003 }
Jamie Madillaff71502013-07-02 11:57:05 -04004004 }
4005 else
4006 {
4007 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004008 }
4009 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010 }
4011 catch(std::bad_alloc&)
4012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004013 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004014 }
4015}
4016
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004017void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004018{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004019 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020
4021 try
4022 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004023 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004024
daniel@transgaming.come0078962010-04-15 20:45:08 +00004025 if (context)
4026 {
4027 if (index >= gl::MAX_VERTEX_ATTRIBS)
4028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004029 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004030 }
4031
4032 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004034 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004035 }
4036
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004037 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004038 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039 }
4040 catch(std::bad_alloc&)
4041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043 }
4044}
4045
4046void __stdcall glHint(GLenum target, GLenum mode)
4047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004048 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049
4050 try
4051 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004052 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004053 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004054 case GL_FASTEST:
4055 case GL_NICEST:
4056 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004057 break;
4058 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004059 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004060 }
4061
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004062 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004063 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004064 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004065 case GL_GENERATE_MIPMAP_HINT:
4066 if (context) context->setGenerateMipmapHint(mode);
4067 break;
4068 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4069 if (context) context->setFragmentShaderDerivativeHint(mode);
4070 break;
4071 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004073 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074 }
4075 catch(std::bad_alloc&)
4076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004078 }
4079}
4080
4081GLboolean __stdcall glIsBuffer(GLuint buffer)
4082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004083 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084
4085 try
4086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004088
4089 if (context && buffer)
4090 {
4091 gl::Buffer *bufferObject = context->getBuffer(buffer);
4092
4093 if (bufferObject)
4094 {
4095 return GL_TRUE;
4096 }
4097 }
4098 }
4099 catch(std::bad_alloc&)
4100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004102 }
4103
4104 return GL_FALSE;
4105}
4106
4107GLboolean __stdcall glIsEnabled(GLenum cap)
4108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004109 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004110
4111 try
4112 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004114
4115 if (context)
4116 {
Geoff Lang0550d032014-01-30 11:29:07 -05004117 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004119 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004120 }
Geoff Lang0550d032014-01-30 11:29:07 -05004121
4122 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004123 }
4124 }
4125 catch(std::bad_alloc&)
4126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004127 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004128 }
4129
4130 return false;
4131}
4132
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004133GLboolean __stdcall glIsFenceNV(GLuint fence)
4134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004135 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004136
4137 try
4138 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004139 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004140
4141 if (context)
4142 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004143 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004144
4145 if (fenceObject == NULL)
4146 {
4147 return GL_FALSE;
4148 }
4149
4150 return fenceObject->isFence();
4151 }
4152 }
4153 catch(std::bad_alloc&)
4154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004155 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004156 }
4157
4158 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004159}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004163 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164
4165 try
4166 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004167 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004168
4169 if (context && framebuffer)
4170 {
4171 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4172
4173 if (framebufferObject)
4174 {
4175 return GL_TRUE;
4176 }
4177 }
4178 }
4179 catch(std::bad_alloc&)
4180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004181 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182 }
4183
4184 return GL_FALSE;
4185}
4186
4187GLboolean __stdcall glIsProgram(GLuint program)
4188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004189 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004190
4191 try
4192 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004193 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194
4195 if (context && program)
4196 {
4197 gl::Program *programObject = context->getProgram(program);
4198
4199 if (programObject)
4200 {
4201 return GL_TRUE;
4202 }
4203 }
4204 }
4205 catch(std::bad_alloc&)
4206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004207 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208 }
4209
4210 return GL_FALSE;
4211}
4212
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004213GLboolean __stdcall glIsQueryEXT(GLuint id)
4214{
4215 EVENT("(GLuint id = %d)", id);
4216
4217 try
4218 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004219 gl::Context *context = gl::getNonLostContext();
4220
4221 if (context)
4222 {
Geoff Lang37dde692014-01-31 16:34:54 -05004223 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004224 }
4225 }
4226 catch(std::bad_alloc&)
4227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004228 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004229 }
4230
4231 return GL_FALSE;
4232}
4233
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004234GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004236 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004237
4238 try
4239 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241
4242 if (context && renderbuffer)
4243 {
4244 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4245
4246 if (renderbufferObject)
4247 {
4248 return GL_TRUE;
4249 }
4250 }
4251 }
4252 catch(std::bad_alloc&)
4253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004254 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004255 }
4256
4257 return GL_FALSE;
4258}
4259
4260GLboolean __stdcall glIsShader(GLuint shader)
4261{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004262 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263
4264 try
4265 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267
4268 if (context && shader)
4269 {
4270 gl::Shader *shaderObject = context->getShader(shader);
4271
4272 if (shaderObject)
4273 {
4274 return GL_TRUE;
4275 }
4276 }
4277 }
4278 catch(std::bad_alloc&)
4279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004280 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004281 }
4282
4283 return GL_FALSE;
4284}
4285
4286GLboolean __stdcall glIsTexture(GLuint texture)
4287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004288 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004289
4290 try
4291 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004292 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004293
4294 if (context && texture)
4295 {
4296 gl::Texture *textureObject = context->getTexture(texture);
4297
4298 if (textureObject)
4299 {
4300 return GL_TRUE;
4301 }
4302 }
4303 }
4304 catch(std::bad_alloc&)
4305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004306 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004307 }
4308
4309 return GL_FALSE;
4310}
4311
4312void __stdcall glLineWidth(GLfloat width)
4313{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004314 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004315
4316 try
4317 {
4318 if (width <= 0.0f)
4319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004320 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004323 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004324
4325 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004327 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004328 }
4329 }
4330 catch(std::bad_alloc&)
4331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004332 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333 }
4334}
4335
4336void __stdcall glLinkProgram(GLuint program)
4337{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004338 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339
4340 try
4341 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343
4344 if (context)
4345 {
4346 gl::Program *programObject = context->getProgram(program);
4347
4348 if (!programObject)
4349 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004350 if (context->getShader(program))
4351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004352 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004353 }
4354 else
4355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004356 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004357 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358 }
4359
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004360 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004361 }
4362 }
4363 catch(std::bad_alloc&)
4364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004365 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
4367}
4368
4369void __stdcall glPixelStorei(GLenum pname, GLint param)
4370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004371 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004372
4373 try
4374 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004376
4377 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004379 switch (pname)
4380 {
4381 case GL_UNPACK_ALIGNMENT:
4382 if (param != 1 && param != 2 && param != 4 && param != 8)
4383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004385 }
4386
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004387 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004388 break;
4389
4390 case GL_PACK_ALIGNMENT:
4391 if (param != 1 && param != 2 && param != 4 && param != 8)
4392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004394 }
4395
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004396 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004397 break;
4398
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004399 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4400 context->setPackReverseRowOrder(param != 0);
4401 break;
4402
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004403 case GL_UNPACK_IMAGE_HEIGHT:
4404 case GL_UNPACK_SKIP_IMAGES:
4405 case GL_UNPACK_ROW_LENGTH:
4406 case GL_UNPACK_SKIP_ROWS:
4407 case GL_UNPACK_SKIP_PIXELS:
4408 case GL_PACK_ROW_LENGTH:
4409 case GL_PACK_SKIP_ROWS:
4410 case GL_PACK_SKIP_PIXELS:
4411 if (context->getClientVersion() < 3)
4412 {
4413 return gl::error(GL_INVALID_ENUM);
4414 }
4415 UNIMPLEMENTED();
4416 break;
4417
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004418 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004419 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 }
4422 }
4423 catch(std::bad_alloc&)
4424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426 }
4427}
4428
4429void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4430{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004431 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004432
4433 try
4434 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004436
4437 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004439 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004440 }
4441 }
4442 catch(std::bad_alloc&)
4443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004444 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445 }
4446}
4447
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004448void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4449 GLenum format, GLenum type, GLsizei bufSize,
4450 GLvoid *data)
4451{
4452 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4453 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4454 x, y, width, height, format, type, bufSize, data);
4455
4456 try
4457 {
4458 if (width < 0 || height < 0 || bufSize < 0)
4459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004460 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004461 }
4462
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004463 gl::Context *context = gl::getNonLostContext();
4464
4465 if (context)
4466 {
Jamie Madill26e91952014-03-05 15:01:27 -05004467 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4468 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004469 {
Jamie Madill26e91952014-03-05 15:01:27 -05004470 return;
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, &bufSize, data);
4474 }
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.comb7915a52011-11-12 03:14:20 +00004479 }
4480}
4481
4482void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4483 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004484{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004485 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004486 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004487 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004488
4489 try
4490 {
4491 if (width < 0 || height < 0)
4492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494 }
4495
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004496 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497
4498 if (context)
4499 {
Jamie Madill26e91952014-03-05 15:01:27 -05004500 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4501 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004502 {
Jamie Madill26e91952014-03-05 15:01:27 -05004503 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004504 }
4505
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004506 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507 }
4508 }
4509 catch(std::bad_alloc&)
4510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512 }
4513}
4514
4515void __stdcall glReleaseShaderCompiler(void)
4516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004517 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518
4519 try
4520 {
4521 gl::Shader::releaseCompiler();
4522 }
4523 catch(std::bad_alloc&)
4524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 }
4527}
4528
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004529void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004531 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 +00004532 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533
4534 try
4535 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537
4538 if (context)
4539 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004540 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004541 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004542 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004543 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004544 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004545
4546 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004547 }
4548 }
4549 catch(std::bad_alloc&)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004552 }
4553}
4554
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004555void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4556{
4557 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4558}
4559
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4561{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004562 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563
4564 try
4565 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004566 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 if (context)
4569 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004570 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 }
4572 }
4573 catch(std::bad_alloc&)
4574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004575 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576 }
4577}
4578
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004579void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004581 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004582
4583 try
4584 {
4585 if (condition != GL_ALL_COMPLETED_NV)
4586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004587 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004588 }
4589
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004590 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004591
4592 if (context)
4593 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004594 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004595
4596 if (fenceObject == NULL)
4597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004598 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004599 }
4600
4601 fenceObject->setFence(condition);
4602 }
4603 }
4604 catch(std::bad_alloc&)
4605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004606 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004607 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004608}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004609
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004610void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4611{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004612 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 +00004613
4614 try
4615 {
4616 if (width < 0 || height < 0)
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004621 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004622
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623 if (context)
4624 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004625 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626 }
4627 }
4628 catch(std::bad_alloc&)
4629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004630 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631 }
4632}
4633
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004634void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004636 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004637 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004638 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639
4640 try
4641 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004642 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004643 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644 }
4645 catch(std::bad_alloc&)
4646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004647 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648 }
4649}
4650
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004651void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004653 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 +00004654 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004655
4656 try
4657 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004658 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004660 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661 }
4662
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004663 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004664
4665 if (context)
4666 {
4667 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004668
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 if (!shaderObject)
4670 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004671 if (context->getProgram(shader))
4672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004673 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004674 }
4675 else
4676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004678 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679 }
4680
4681 shaderObject->setSource(count, string, length);
4682 }
4683 }
4684 catch(std::bad_alloc&)
4685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687 }
4688}
4689
4690void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4691{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004692 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693}
4694
4695void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004697 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 +00004698
4699 try
4700 {
4701 switch (face)
4702 {
4703 case GL_FRONT:
4704 case GL_BACK:
4705 case GL_FRONT_AND_BACK:
4706 break;
4707 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004708 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004709 }
4710
4711 switch (func)
4712 {
4713 case GL_NEVER:
4714 case GL_ALWAYS:
4715 case GL_LESS:
4716 case GL_LEQUAL:
4717 case GL_EQUAL:
4718 case GL_GEQUAL:
4719 case GL_GREATER:
4720 case GL_NOTEQUAL:
4721 break;
4722 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724 }
4725
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004726 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004727
4728 if (context)
4729 {
4730 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4731 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004732 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733 }
4734
4735 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4736 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004737 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738 }
4739 }
4740 }
4741 catch(std::bad_alloc&)
4742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745}
4746
4747void __stdcall glStencilMask(GLuint mask)
4748{
4749 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4750}
4751
4752void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4753{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004754 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755
4756 try
4757 {
4758 switch (face)
4759 {
4760 case GL_FRONT:
4761 case GL_BACK:
4762 case GL_FRONT_AND_BACK:
4763 break;
4764 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004765 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 }
4767
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769
4770 if (context)
4771 {
4772 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4773 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004774 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 }
4776
4777 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4778 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004779 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004780 }
4781 }
4782 }
4783 catch(std::bad_alloc&)
4784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787}
4788
4789void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4790{
4791 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4792}
4793
4794void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4795{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004796 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 +00004797 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798
4799 try
4800 {
4801 switch (face)
4802 {
4803 case GL_FRONT:
4804 case GL_BACK:
4805 case GL_FRONT_AND_BACK:
4806 break;
4807 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004808 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004809 }
4810
4811 switch (fail)
4812 {
4813 case GL_ZERO:
4814 case GL_KEEP:
4815 case GL_REPLACE:
4816 case GL_INCR:
4817 case GL_DECR:
4818 case GL_INVERT:
4819 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004820 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821 break;
4822 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004823 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 }
4825
4826 switch (zfail)
4827 {
4828 case GL_ZERO:
4829 case GL_KEEP:
4830 case GL_REPLACE:
4831 case GL_INCR:
4832 case GL_DECR:
4833 case GL_INVERT:
4834 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004835 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836 break;
4837 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004838 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839 }
4840
4841 switch (zpass)
4842 {
4843 case GL_ZERO:
4844 case GL_KEEP:
4845 case GL_REPLACE:
4846 case GL_INCR:
4847 case GL_DECR:
4848 case GL_INVERT:
4849 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004850 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004851 break;
4852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854 }
4855
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857
4858 if (context)
4859 {
4860 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4861 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004862 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863 }
4864
4865 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4866 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004867 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868 }
4869 }
4870 }
4871 catch(std::bad_alloc&)
4872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004873 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004874 }
4875}
4876
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004877GLboolean __stdcall glTestFenceNV(GLuint fence)
4878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004879 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004880
4881 try
4882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004883 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004884
4885 if (context)
4886 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004887 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004888
4889 if (fenceObject == NULL)
4890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004891 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004892 }
4893
Jamie Madillfb9a7402013-07-26 11:55:01 -04004894 if (fenceObject->isFence() != GL_TRUE)
4895 {
4896 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4897 }
4898
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004899 return fenceObject->testFence();
4900 }
4901 }
4902 catch(std::bad_alloc&)
4903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004904 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004905 }
4906
4907 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004908}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004909
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004910void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4911 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004912{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004913 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004914 "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 +00004915 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916
4917 try
4918 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920
4921 if (context)
4922 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004923 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004924 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004925 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004926 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004927 return;
4928 }
4929
4930 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004931 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004932 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004933 {
4934 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004935 }
4936
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004937 switch (target)
4938 {
4939 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004940 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004941 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004942 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004943 }
4944 break;
4945 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004946 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004947 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004948 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004950 break;
4951 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4952 {
4953 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004954 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004955 }
4956 break;
4957 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4958 {
4959 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004960 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004961 }
4962 break;
4963 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4964 {
4965 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004966 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004967 }
4968 break;
4969 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4970 {
4971 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004972 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004973 }
4974 break;
4975 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4976 {
4977 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004978 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004979 }
4980 break;
4981 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982 }
4983 }
4984 }
4985 catch(std::bad_alloc&)
4986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988 }
4989}
4990
4991void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4992{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004993 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4994
4995 try
4996 {
4997 gl::Context *context = gl::getNonLostContext();
4998
4999 if (context)
5000 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005001 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005002 {
5003 return;
5004 }
5005
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005006 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005007
Jamie Madillfb8a8302013-07-03 14:24:12 -04005008 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005011 }
5012
5013 switch (pname)
5014 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005015 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5016 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5017 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5018 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5019 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5020 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005021 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005022 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5023 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005024 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5025 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5026 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5027 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005028 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
5029 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
5030 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
5031 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005032 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005033 }
5034 }
5035 }
5036 catch(std::bad_alloc&)
5037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005039 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040}
5041
5042void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5043{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005044 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045}
5046
5047void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005049 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005050
5051 try
5052 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005054
5055 if (context)
5056 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005057 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005058 {
5059 return;
5060 }
5061
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005062 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063
Jamie Madillfb8a8302013-07-03 14:24:12 -04005064 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005067 }
5068
5069 switch (pname)
5070 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005071 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5072 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5073 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5074 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5075 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5076 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5077 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5078 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5079 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005080 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5081 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5082 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5083 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005084 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5085 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5086 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5087 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005088 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005089 }
5090 }
5091 }
5092 catch(std::bad_alloc&)
5093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005094 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005095 }
5096}
5097
5098void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5099{
5100 glTexParameteri(target, pname, *params);
5101}
5102
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005103void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5104{
5105 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5106 target, levels, internalformat, width, height);
5107
5108 try
5109 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005110 gl::Context *context = gl::getNonLostContext();
5111
5112 if (context)
5113 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005114 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005115 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005116 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005117 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005118 }
5119
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005120 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005121 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005122 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005123 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005124 }
5125
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005126 switch (target)
5127 {
5128 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005129 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005130 gl::Texture2D *texture2d = context->getTexture2D();
5131 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005132 }
5133 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005134
Geoff Lang01c21d22013-09-24 11:52:16 -04005135 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005136 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005137 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5138 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005139 }
5140 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005141
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005142 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005143 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005144 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005145 }
5146 }
5147 catch(std::bad_alloc&)
5148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005150 }
5151}
5152
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005153void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5154 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005155{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005156 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005157 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005158 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159 target, level, xoffset, yoffset, width, height, format, type, pixels);
5160
5161 try
5162 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005164
5165 if (context)
5166 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005167 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005168 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005169 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005170 {
5171 return;
5172 }
5173
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005174 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005175 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005176 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005177 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005178 return;
5179 }
5180
Geoff Langc41e42d2014-04-28 10:58:16 -04005181 // Zero sized uploads are valid but no-ops
5182 if (width == 0 || height == 0)
5183 {
5184 return;
5185 }
5186
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005187 switch (target)
5188 {
5189 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005190 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005191 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005192 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005193 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005194 break;
5195
5196 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5197 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5198 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5199 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5200 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5201 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005202 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005203 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005204 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005205 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005206 break;
5207
5208 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005209 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005210 }
5211 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 }
5213 catch(std::bad_alloc&)
5214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005215 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216 }
5217}
5218
5219void __stdcall glUniform1f(GLint location, GLfloat x)
5220{
5221 glUniform1fv(location, 1, &x);
5222}
5223
5224void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5225{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005226 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227
5228 try
5229 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 if (count < 0)
5231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005232 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233 }
5234
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005235 if (location == -1)
5236 {
5237 return;
5238 }
5239
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241
5242 if (context)
5243 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005244 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005245 if (!programBinary)
5246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005248 }
5249
5250 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005252 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 }
5254 }
5255 }
5256 catch(std::bad_alloc&)
5257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
5260}
5261
5262void __stdcall glUniform1i(GLint location, GLint x)
5263{
5264 glUniform1iv(location, 1, &x);
5265}
5266
5267void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5268{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005269 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270
5271 try
5272 {
5273 if (count < 0)
5274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276 }
5277
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005278 if (location == -1)
5279 {
5280 return;
5281 }
5282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284
5285 if (context)
5286 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005287 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005288 if (!programBinary)
5289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005290 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005291 }
5292
5293 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005295 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 }
5297 }
5298 }
5299 catch(std::bad_alloc&)
5300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005301 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005302 }
5303}
5304
5305void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5306{
5307 GLfloat xy[2] = {x, y};
5308
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005309 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005310}
5311
5312void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5313{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005314 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315
5316 try
5317 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 if (count < 0)
5319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005320 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005322
5323 if (location == -1)
5324 {
5325 return;
5326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005327
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005329
5330 if (context)
5331 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005332 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005333 if (!programBinary)
5334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005335 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005336 }
5337
5338 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341 }
5342 }
5343 }
5344 catch(std::bad_alloc&)
5345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347 }
5348}
5349
5350void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5351{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005352 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005354 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355}
5356
5357void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5358{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005359 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360
5361 try
5362 {
5363 if (count < 0)
5364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005365 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366 }
5367
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005368 if (location == -1)
5369 {
5370 return;
5371 }
5372
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005374
5375 if (context)
5376 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005377 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005378 if (!programBinary)
5379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005380 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005381 }
5382
5383 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005385 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005386 }
5387 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388 }
5389 catch(std::bad_alloc&)
5390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005391 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005392 }
5393}
5394
5395void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5396{
5397 GLfloat xyz[3] = {x, y, z};
5398
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005399 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400}
5401
5402void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5403{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005404 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405
5406 try
5407 {
5408 if (count < 0)
5409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005411 }
5412
5413 if (location == -1)
5414 {
5415 return;
5416 }
5417
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005419
5420 if (context)
5421 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005422 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005423 if (!programBinary)
5424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005425 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005426 }
5427
5428 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005430 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431 }
5432 }
5433 }
5434 catch(std::bad_alloc&)
5435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005436 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005437 }
5438}
5439
5440void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5441{
5442 GLint xyz[3] = {x, y, z};
5443
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005444 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445}
5446
5447void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005449 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005450
5451 try
5452 {
5453 if (count < 0)
5454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005455 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456 }
5457
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005458 if (location == -1)
5459 {
5460 return;
5461 }
5462
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005463 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005464
5465 if (context)
5466 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005467 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005468 if (!programBinary)
5469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005471 }
5472
5473 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005475 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005476 }
5477 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 }
5479 catch(std::bad_alloc&)
5480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005482 }
5483}
5484
5485void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5486{
5487 GLfloat xyzw[4] = {x, y, z, w};
5488
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005489 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490}
5491
5492void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005494 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495
5496 try
5497 {
5498 if (count < 0)
5499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005500 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005501 }
5502
5503 if (location == -1)
5504 {
5505 return;
5506 }
5507
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005508 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509
5510 if (context)
5511 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005512 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005513 if (!programBinary)
5514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005516 }
5517
5518 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005521 }
5522 }
5523 }
5524 catch(std::bad_alloc&)
5525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005526 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527 }
5528}
5529
5530void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5531{
5532 GLint xyzw[4] = {x, y, z, w};
5533
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005534 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005535}
5536
5537void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5538{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005539 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540
5541 try
5542 {
5543 if (count < 0)
5544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005545 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 }
5547
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005548 if (location == -1)
5549 {
5550 return;
5551 }
5552
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005553 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005554
5555 if (context)
5556 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005557 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005558 if (!programBinary)
5559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005560 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005561 }
5562
5563 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005566 }
5567 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005568 }
5569 catch(std::bad_alloc&)
5570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572 }
5573}
5574
5575void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5576{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005577 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005578 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005579
5580 try
5581 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005582 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005584 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 }
5586
5587 if (location == -1)
5588 {
5589 return;
5590 }
5591
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005592 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593
5594 if (context)
5595 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005596 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5597 {
5598 return gl::error(GL_INVALID_VALUE);
5599 }
5600
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005601 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005602 if (!programBinary)
5603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005604 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005605 }
5606
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005607 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005610 }
5611 }
5612 }
5613 catch(std::bad_alloc&)
5614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005615 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616 }
5617}
5618
5619void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5620{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005621 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005622 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623
5624 try
5625 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005626 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630
5631 if (location == -1)
5632 {
5633 return;
5634 }
5635
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637
5638 if (context)
5639 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005640 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5641 {
5642 return gl::error(GL_INVALID_VALUE);
5643 }
5644
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005645 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005646 if (!programBinary)
5647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005649 }
5650
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005651 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005653 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005654 }
5655 }
5656 }
5657 catch(std::bad_alloc&)
5658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005660 }
5661}
5662
5663void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5664{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005665 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005666 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667
5668 try
5669 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005670 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673 }
5674
5675 if (location == -1)
5676 {
5677 return;
5678 }
5679
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005681
5682 if (context)
5683 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005684 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5685 {
5686 return gl::error(GL_INVALID_VALUE);
5687 }
5688
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005689 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005690 if (!programBinary)
5691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005692 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005693 }
5694
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005695 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005697 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005698 }
5699 }
5700 }
5701 catch(std::bad_alloc&)
5702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005704 }
5705}
5706
5707void __stdcall glUseProgram(GLuint program)
5708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005709 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005710
5711 try
5712 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714
5715 if (context)
5716 {
5717 gl::Program *programObject = context->getProgram(program);
5718
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005719 if (!programObject && program != 0)
5720 {
5721 if (context->getShader(program))
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005724 }
5725 else
5726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005728 }
5729 }
5730
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005731 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
5735
5736 context->useProgram(program);
5737 }
5738 }
5739 catch(std::bad_alloc&)
5740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005742 }
5743}
5744
5745void __stdcall glValidateProgram(GLuint program)
5746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005747 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748
5749 try
5750 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005751 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005752
5753 if (context)
5754 {
5755 gl::Program *programObject = context->getProgram(program);
5756
5757 if (!programObject)
5758 {
5759 if (context->getShader(program))
5760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005762 }
5763 else
5764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005766 }
5767 }
5768
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005769 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005770 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005771 }
5772 catch(std::bad_alloc&)
5773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005775 }
5776}
5777
5778void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005780 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781
5782 try
5783 {
5784 if (index >= gl::MAX_VERTEX_ATTRIBS)
5785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 }
5788
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005790
5791 if (context)
5792 {
5793 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005794 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005795 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796 }
5797 catch(std::bad_alloc&)
5798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005799 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800 }
5801}
5802
5803void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005805 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806
5807 try
5808 {
5809 if (index >= gl::MAX_VERTEX_ATTRIBS)
5810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812 }
5813
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005814 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005815
5816 if (context)
5817 {
5818 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005819 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005821 }
5822 catch(std::bad_alloc&)
5823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005824 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825 }
5826}
5827
5828void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005830 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831
5832 try
5833 {
5834 if (index >= gl::MAX_VERTEX_ATTRIBS)
5835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005837 }
5838
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005840
5841 if (context)
5842 {
5843 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005844 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005845 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005846 }
5847 catch(std::bad_alloc&)
5848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005850 }
5851}
5852
5853void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5854{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005855 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856
5857 try
5858 {
5859 if (index >= gl::MAX_VERTEX_ATTRIBS)
5860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862 }
5863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005865
5866 if (context)
5867 {
5868 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005869 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005870 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005871 }
5872 catch(std::bad_alloc&)
5873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005875 }
5876}
5877
5878void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005880 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 +00005881
5882 try
5883 {
5884 if (index >= gl::MAX_VERTEX_ATTRIBS)
5885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005886 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005887 }
5888
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005890
5891 if (context)
5892 {
5893 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005894 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005895 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005896 }
5897 catch(std::bad_alloc&)
5898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005899 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900 }
5901}
5902
5903void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5904{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005905 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906
5907 try
5908 {
5909 if (index >= gl::MAX_VERTEX_ATTRIBS)
5910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005911 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912 }
5913
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005915
5916 if (context)
5917 {
5918 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005919 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005920 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921 }
5922 catch(std::bad_alloc&)
5923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005924 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005925 }
5926}
5927
5928void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005930 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 +00005931
5932 try
5933 {
5934 if (index >= gl::MAX_VERTEX_ATTRIBS)
5935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005936 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 }
5938
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005940
5941 if (context)
5942 {
5943 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005944 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005945 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005946 }
5947 catch(std::bad_alloc&)
5948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005949 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 }
5951}
5952
5953void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005955 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956
5957 try
5958 {
5959 if (index >= gl::MAX_VERTEX_ATTRIBS)
5960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005961 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005962 }
5963
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005964 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005965
5966 if (context)
5967 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005968 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005969 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970 }
5971 catch(std::bad_alloc&)
5972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005974 }
5975}
5976
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005977void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5978{
5979 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5980
5981 try
5982 {
5983 if (index >= gl::MAX_VERTEX_ATTRIBS)
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005986 }
5987
5988 gl::Context *context = gl::getNonLostContext();
5989
5990 if (context)
5991 {
5992 context->setVertexAttribDivisor(index, divisor);
5993 }
5994 }
5995 catch(std::bad_alloc&)
5996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005997 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005998 }
5999}
6000
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006001void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006002{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006003 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006004 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006005 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006006
6007 try
6008 {
6009 if (index >= gl::MAX_VERTEX_ATTRIBS)
6010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006011 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006012 }
6013
6014 if (size < 1 || size > 4)
6015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006016 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006017 }
6018
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006019 gl::Context *context = gl::getNonLostContext();
6020
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006021 switch (type)
6022 {
6023 case GL_BYTE:
6024 case GL_UNSIGNED_BYTE:
6025 case GL_SHORT:
6026 case GL_UNSIGNED_SHORT:
6027 case GL_FIXED:
6028 case GL_FLOAT:
6029 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006030 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006031 case GL_INT:
6032 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006033 case GL_INT_2_10_10_10_REV:
6034 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006035 if (context && context->getClientVersion() < 3)
6036 {
6037 return gl::error(GL_INVALID_ENUM);
6038 }
6039 else
6040 {
6041 break;
6042 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006043 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006044 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006045 }
6046
6047 if (stride < 0)
6048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006050 }
6051
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006052 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6053 {
6054 return gl::error(GL_INVALID_OPERATION);
6055 }
6056
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006057 if (context)
6058 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006059 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6060 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6061 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6062 // and the pointer argument is not NULL.
6063 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6064 {
6065 return gl::error(GL_INVALID_OPERATION);
6066 }
6067
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006068 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6069 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070 }
6071 }
6072 catch(std::bad_alloc&)
6073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006075 }
6076}
6077
6078void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006080 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 +00006081
6082 try
6083 {
6084 if (width < 0 || height < 0)
6085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006086 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006087 }
6088
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006089 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006090
6091 if (context)
6092 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006093 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006094 }
6095 }
6096 catch(std::bad_alloc&)
6097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006099 }
6100}
6101
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006102// OpenGL ES 3.0 functions
6103
6104void __stdcall glReadBuffer(GLenum mode)
6105{
6106 EVENT("(GLenum mode = 0x%X)", mode);
6107
6108 try
6109 {
6110 gl::Context *context = gl::getNonLostContext();
6111
6112 if (context)
6113 {
6114 if (context->getClientVersion() < 3)
6115 {
6116 return gl::error(GL_INVALID_OPERATION);
6117 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006118
Jamie Madill54133512013-06-21 09:33:07 -04006119 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006120 UNIMPLEMENTED();
6121 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006122 }
6123 catch(std::bad_alloc&)
6124 {
6125 return gl::error(GL_OUT_OF_MEMORY);
6126 }
6127}
6128
6129void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6130{
6131 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6132 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6133
6134 try
6135 {
6136 gl::Context *context = gl::getNonLostContext();
6137
6138 if (context)
6139 {
6140 if (context->getClientVersion() < 3)
6141 {
6142 return gl::error(GL_INVALID_OPERATION);
6143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006144
Jamie Madill54133512013-06-21 09:33:07 -04006145 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006146 UNIMPLEMENTED();
6147 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006148 }
6149 catch(std::bad_alloc&)
6150 {
6151 return gl::error(GL_OUT_OF_MEMORY);
6152 }
6153}
6154
6155void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6156{
6157 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6158 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6159 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6160 target, level, internalformat, width, height, depth, border, format, type, pixels);
6161
6162 try
6163 {
6164 gl::Context *context = gl::getNonLostContext();
6165
6166 if (context)
6167 {
6168 if (context->getClientVersion() < 3)
6169 {
6170 return gl::error(GL_INVALID_OPERATION);
6171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006172
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006173 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006174 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006175 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006176 {
6177 return;
6178 }
6179
6180 switch(target)
6181 {
6182 case GL_TEXTURE_3D:
6183 {
6184 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006185 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006186 }
6187 break;
6188
6189 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006190 {
6191 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006192 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006193 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006194 break;
6195
6196 default:
6197 return gl::error(GL_INVALID_ENUM);
6198 }
6199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006200 }
6201 catch(std::bad_alloc&)
6202 {
6203 return gl::error(GL_OUT_OF_MEMORY);
6204 }
6205}
6206
6207void __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)
6208{
6209 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6210 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6211 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6212 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6213
6214 try
6215 {
6216 gl::Context *context = gl::getNonLostContext();
6217
6218 if (context)
6219 {
6220 if (context->getClientVersion() < 3)
6221 {
6222 return gl::error(GL_INVALID_OPERATION);
6223 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006224
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006225 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006226 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006227 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006228 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006229 {
6230 return;
6231 }
6232
Geoff Langc41e42d2014-04-28 10:58:16 -04006233 // Zero sized uploads are valid but no-ops
6234 if (width == 0 || height == 0 || depth == 0)
6235 {
6236 return;
6237 }
6238
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006239 switch(target)
6240 {
6241 case GL_TEXTURE_3D:
6242 {
6243 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006244 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 +00006245 }
6246 break;
6247
6248 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006249 {
6250 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006251 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 +00006252 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006253 break;
6254
6255 default:
6256 return gl::error(GL_INVALID_ENUM);
6257 }
6258 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006259 }
6260 catch(std::bad_alloc&)
6261 {
6262 return gl::error(GL_OUT_OF_MEMORY);
6263 }
6264}
6265
6266void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6267{
6268 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6269 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6270 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6271
6272 try
6273 {
6274 gl::Context *context = gl::getNonLostContext();
6275
6276 if (context)
6277 {
6278 if (context->getClientVersion() < 3)
6279 {
6280 return gl::error(GL_INVALID_OPERATION);
6281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006282
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006283 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006284 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006285 {
6286 return;
6287 }
6288
Geoff Langc41e42d2014-04-28 10:58:16 -04006289 // Zero sized copies are valid but no-ops
6290 if (width == 0 || height == 0)
6291 {
6292 return;
6293 }
6294
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006295 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6296 gl::Texture *texture = NULL;
6297 switch (target)
6298 {
6299 case GL_TEXTURE_3D:
6300 texture = context->getTexture3D();
6301 break;
6302
6303 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006304 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006305 break;
6306
6307 default:
6308 return gl::error(GL_INVALID_ENUM);
6309 }
6310
6311 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006313 }
6314 catch(std::bad_alloc&)
6315 {
6316 return gl::error(GL_OUT_OF_MEMORY);
6317 }
6318}
6319
6320void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6321{
Geoff Langeef52cc2013-10-16 15:07:39 -04006322 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 +00006323 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6324 "const GLvoid* data = 0x%0.8p)",
6325 target, level, internalformat, width, height, depth, border, imageSize, data);
6326
6327 try
6328 {
6329 gl::Context *context = gl::getNonLostContext();
6330
6331 if (context)
6332 {
6333 if (context->getClientVersion() < 3)
6334 {
6335 return gl::error(GL_INVALID_OPERATION);
6336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006337
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006338 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 +00006339 {
6340 return gl::error(GL_INVALID_VALUE);
6341 }
6342
6343 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006344 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006345 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006346 {
6347 return;
6348 }
6349
6350 switch(target)
6351 {
6352 case GL_TEXTURE_3D:
6353 {
6354 gl::Texture3D *texture = context->getTexture3D();
6355 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6356 }
6357 break;
6358
6359 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006360 {
6361 gl::Texture2DArray *texture = context->getTexture2DArray();
6362 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6363 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006364 break;
6365
6366 default:
6367 return gl::error(GL_INVALID_ENUM);
6368 }
6369 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006370 }
6371 catch(std::bad_alloc&)
6372 {
6373 return gl::error(GL_OUT_OF_MEMORY);
6374 }
6375}
6376
6377void __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)
6378{
6379 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6380 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6381 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6382 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6383
6384 try
6385 {
6386 gl::Context *context = gl::getNonLostContext();
6387
6388 if (context)
6389 {
6390 if (context->getClientVersion() < 3)
6391 {
6392 return gl::error(GL_INVALID_OPERATION);
6393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006394
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006395 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 +00006396 {
6397 return gl::error(GL_INVALID_VALUE);
6398 }
6399
6400 if (!data)
6401 {
6402 return gl::error(GL_INVALID_VALUE);
6403 }
6404
6405 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006406 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006407 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006408 {
6409 return;
6410 }
6411
Geoff Langc41e42d2014-04-28 10:58:16 -04006412 // Zero sized uploads are valid but no-ops
6413 if (width == 0 || height == 0)
6414 {
6415 return;
6416 }
6417
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006418 switch(target)
6419 {
6420 case GL_TEXTURE_3D:
6421 {
6422 gl::Texture3D *texture = context->getTexture3D();
6423 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6424 format, imageSize, data);
6425 }
6426 break;
6427
6428 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006429 {
6430 gl::Texture2DArray *texture = context->getTexture2DArray();
6431 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6432 format, imageSize, data);
6433 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006434 break;
6435
6436 default:
6437 return gl::error(GL_INVALID_ENUM);
6438 }
6439 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006440 }
6441 catch(std::bad_alloc&)
6442 {
6443 return gl::error(GL_OUT_OF_MEMORY);
6444 }
6445}
6446
6447void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6448{
6449 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6450
6451 try
6452 {
6453 gl::Context *context = gl::getNonLostContext();
6454
6455 if (context)
6456 {
6457 if (context->getClientVersion() < 3)
6458 {
6459 return gl::error(GL_INVALID_OPERATION);
6460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006461
Geoff Lang37dde692014-01-31 16:34:54 -05006462 if (n < 0)
6463 {
6464 return gl::error(GL_INVALID_VALUE);
6465 }
6466
6467 for (GLsizei i = 0; i < n; i++)
6468 {
6469 ids[i] = context->createQuery();
6470 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006471 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006472 }
6473 catch(std::bad_alloc&)
6474 {
6475 return gl::error(GL_OUT_OF_MEMORY);
6476 }
6477}
6478
6479void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6480{
6481 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6482
6483 try
6484 {
6485 gl::Context *context = gl::getNonLostContext();
6486
6487 if (context)
6488 {
6489 if (context->getClientVersion() < 3)
6490 {
6491 return gl::error(GL_INVALID_OPERATION);
6492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006493
Geoff Lang37dde692014-01-31 16:34:54 -05006494 if (n < 0)
6495 {
6496 return gl::error(GL_INVALID_VALUE);
6497 }
6498
6499 for (GLsizei i = 0; i < n; i++)
6500 {
6501 context->deleteQuery(ids[i]);
6502 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006504 }
6505 catch(std::bad_alloc&)
6506 {
6507 return gl::error(GL_OUT_OF_MEMORY);
6508 }
6509}
6510
6511GLboolean __stdcall glIsQuery(GLuint id)
6512{
6513 EVENT("(GLuint id = %u)", id);
6514
6515 try
6516 {
6517 gl::Context *context = gl::getNonLostContext();
6518
6519 if (context)
6520 {
6521 if (context->getClientVersion() < 3)
6522 {
6523 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006525
Geoff Lang37dde692014-01-31 16:34:54 -05006526 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528 }
6529 catch(std::bad_alloc&)
6530 {
6531 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6532 }
6533
6534 return GL_FALSE;
6535}
6536
6537void __stdcall glBeginQuery(GLenum target, GLuint id)
6538{
6539 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6540
6541 try
6542 {
6543 gl::Context *context = gl::getNonLostContext();
6544
6545 if (context)
6546 {
6547 if (context->getClientVersion() < 3)
6548 {
6549 return gl::error(GL_INVALID_OPERATION);
6550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006551
Geoff Lang37dde692014-01-31 16:34:54 -05006552 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006553 {
Geoff Lang37dde692014-01-31 16:34:54 -05006554 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006555 }
6556
6557 if (id == 0)
6558 {
6559 return gl::error(GL_INVALID_OPERATION);
6560 }
6561
Geoff Lang37dde692014-01-31 16:34:54 -05006562 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006564 }
6565 catch(std::bad_alloc&)
6566 {
6567 return gl::error(GL_OUT_OF_MEMORY);
6568 }
6569}
6570
6571void __stdcall glEndQuery(GLenum target)
6572{
6573 EVENT("(GLenum target = 0x%X)", target);
6574
6575 try
6576 {
6577 gl::Context *context = gl::getNonLostContext();
6578
6579 if (context)
6580 {
6581 if (context->getClientVersion() < 3)
6582 {
6583 return gl::error(GL_INVALID_OPERATION);
6584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006585
Geoff Lang37dde692014-01-31 16:34:54 -05006586 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006587 {
Geoff Lang37dde692014-01-31 16:34:54 -05006588 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006589 }
Geoff Lang37dde692014-01-31 16:34:54 -05006590
6591 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006593 }
6594 catch(std::bad_alloc&)
6595 {
6596 return gl::error(GL_OUT_OF_MEMORY);
6597 }
6598}
6599
6600void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6601{
6602 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6603
6604 try
6605 {
6606 gl::Context *context = gl::getNonLostContext();
6607
6608 if (context)
6609 {
6610 if (context->getClientVersion() < 3)
6611 {
6612 return gl::error(GL_INVALID_OPERATION);
6613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006614
Geoff Lang37dde692014-01-31 16:34:54 -05006615 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006616 {
Geoff Lang37dde692014-01-31 16:34:54 -05006617 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006618 }
Geoff Lang37dde692014-01-31 16:34:54 -05006619
6620 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006621 {
Geoff Lang37dde692014-01-31 16:34:54 -05006622 case GL_CURRENT_QUERY:
6623 params[0] = context->getActiveQuery(target);
6624 break;
6625
6626 default:
6627 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006628 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006629 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006630 }
6631 catch(std::bad_alloc&)
6632 {
6633 return gl::error(GL_OUT_OF_MEMORY);
6634 }
6635}
6636
6637void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6638{
6639 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6640
6641 try
6642 {
6643 gl::Context *context = gl::getNonLostContext();
6644
6645 if (context)
6646 {
6647 if (context->getClientVersion() < 3)
6648 {
6649 return gl::error(GL_INVALID_OPERATION);
6650 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006651
Geoff Lang37dde692014-01-31 16:34:54 -05006652 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6653
6654 if (!queryObject)
6655 {
6656 return gl::error(GL_INVALID_OPERATION);
6657 }
6658
6659 if (context->getActiveQuery(queryObject->getType()) == id)
6660 {
6661 return gl::error(GL_INVALID_OPERATION);
6662 }
6663
6664 switch(pname)
6665 {
6666 case GL_QUERY_RESULT:
6667 params[0] = queryObject->getResult();
6668 break;
6669 case GL_QUERY_RESULT_AVAILABLE:
6670 params[0] = queryObject->isResultAvailable();
6671 break;
6672 default:
6673 return gl::error(GL_INVALID_ENUM);
6674 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006675 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006676 }
6677 catch(std::bad_alloc&)
6678 {
6679 return gl::error(GL_OUT_OF_MEMORY);
6680 }
6681}
6682
6683GLboolean __stdcall glUnmapBuffer(GLenum target)
6684{
6685 EVENT("(GLenum target = 0x%X)", target);
6686
6687 try
6688 {
6689 gl::Context *context = gl::getNonLostContext();
6690
6691 if (context)
6692 {
6693 if (context->getClientVersion() < 3)
6694 {
6695 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006697
Shannon Woodsb3801742014-03-27 14:59:19 -04006698 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006700 }
6701 catch(std::bad_alloc&)
6702 {
6703 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6704 }
6705
6706 return GL_FALSE;
6707}
6708
6709void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6710{
6711 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6712
6713 try
6714 {
6715 gl::Context *context = gl::getNonLostContext();
6716
6717 if (context)
6718 {
6719 if (context->getClientVersion() < 3)
6720 {
6721 return gl::error(GL_INVALID_OPERATION);
6722 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006723
Shannon Woodsb3801742014-03-27 14:59:19 -04006724 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006725 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006726 }
6727 catch(std::bad_alloc&)
6728 {
6729 return gl::error(GL_OUT_OF_MEMORY);
6730 }
6731}
6732
6733void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6734{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006735 try
6736 {
6737 gl::Context *context = gl::getNonLostContext();
6738
6739 if (context)
6740 {
6741 if (context->getClientVersion() < 3)
6742 {
6743 return gl::error(GL_INVALID_OPERATION);
6744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006745
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006746 glDrawBuffersEXT(n, bufs);
6747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006748 }
6749 catch(std::bad_alloc&)
6750 {
6751 return gl::error(GL_OUT_OF_MEMORY);
6752 }
6753}
6754
6755void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6756{
6757 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6758 location, count, transpose, value);
6759
6760 try
6761 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006762 if (count < 0)
6763 {
6764 return gl::error(GL_INVALID_VALUE);
6765 }
6766
6767 if (location == -1)
6768 {
6769 return;
6770 }
6771
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006772 gl::Context *context = gl::getNonLostContext();
6773
6774 if (context)
6775 {
6776 if (context->getClientVersion() < 3)
6777 {
6778 return gl::error(GL_INVALID_OPERATION);
6779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006780
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006781 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6782 if (!programBinary)
6783 {
6784 return gl::error(GL_INVALID_OPERATION);
6785 }
6786
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006787 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006788 {
6789 return gl::error(GL_INVALID_OPERATION);
6790 }
6791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 }
6793 catch(std::bad_alloc&)
6794 {
6795 return gl::error(GL_OUT_OF_MEMORY);
6796 }
6797}
6798
6799void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6800{
6801 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6802 location, count, transpose, value);
6803
6804 try
6805 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006806 if (count < 0)
6807 {
6808 return gl::error(GL_INVALID_VALUE);
6809 }
6810
6811 if (location == -1)
6812 {
6813 return;
6814 }
6815
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006816 gl::Context *context = gl::getNonLostContext();
6817
6818 if (context)
6819 {
6820 if (context->getClientVersion() < 3)
6821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006824
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006825 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6826 if (!programBinary)
6827 {
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
6830
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006831 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006832 {
6833 return gl::error(GL_INVALID_OPERATION);
6834 }
6835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006836 }
6837 catch(std::bad_alloc&)
6838 {
6839 return gl::error(GL_OUT_OF_MEMORY);
6840 }
6841}
6842
6843void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6844{
6845 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6846 location, count, transpose, value);
6847
6848 try
6849 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006850 if (count < 0)
6851 {
6852 return gl::error(GL_INVALID_VALUE);
6853 }
6854
6855 if (location == -1)
6856 {
6857 return;
6858 }
6859
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006860 gl::Context *context = gl::getNonLostContext();
6861
6862 if (context)
6863 {
6864 if (context->getClientVersion() < 3)
6865 {
6866 return gl::error(GL_INVALID_OPERATION);
6867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006868
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006869 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6870 if (!programBinary)
6871 {
6872 return gl::error(GL_INVALID_OPERATION);
6873 }
6874
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006875 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006876 {
6877 return gl::error(GL_INVALID_OPERATION);
6878 }
6879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006880 }
6881 catch(std::bad_alloc&)
6882 {
6883 return gl::error(GL_OUT_OF_MEMORY);
6884 }
6885}
6886
6887void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6888{
6889 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6890 location, count, transpose, value);
6891
6892 try
6893 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006894 if (count < 0)
6895 {
6896 return gl::error(GL_INVALID_VALUE);
6897 }
6898
6899 if (location == -1)
6900 {
6901 return;
6902 }
6903
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006904 gl::Context *context = gl::getNonLostContext();
6905
6906 if (context)
6907 {
6908 if (context->getClientVersion() < 3)
6909 {
6910 return gl::error(GL_INVALID_OPERATION);
6911 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006912
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006913 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6914 if (!programBinary)
6915 {
6916 return gl::error(GL_INVALID_OPERATION);
6917 }
6918
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006919 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006920 {
6921 return gl::error(GL_INVALID_OPERATION);
6922 }
6923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006924 }
6925 catch(std::bad_alloc&)
6926 {
6927 return gl::error(GL_OUT_OF_MEMORY);
6928 }
6929}
6930
6931void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6932{
6933 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6934 location, count, transpose, value);
6935
6936 try
6937 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006938 if (count < 0)
6939 {
6940 return gl::error(GL_INVALID_VALUE);
6941 }
6942
6943 if (location == -1)
6944 {
6945 return;
6946 }
6947
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006948 gl::Context *context = gl::getNonLostContext();
6949
6950 if (context)
6951 {
6952 if (context->getClientVersion() < 3)
6953 {
6954 return gl::error(GL_INVALID_OPERATION);
6955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006956
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006957 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6958 if (!programBinary)
6959 {
6960 return gl::error(GL_INVALID_OPERATION);
6961 }
6962
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006963 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006964 {
6965 return gl::error(GL_INVALID_OPERATION);
6966 }
6967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006968 }
6969 catch(std::bad_alloc&)
6970 {
6971 return gl::error(GL_OUT_OF_MEMORY);
6972 }
6973}
6974
6975void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6976{
6977 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6978 location, count, transpose, value);
6979
6980 try
6981 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006982 if (count < 0)
6983 {
6984 return gl::error(GL_INVALID_VALUE);
6985 }
6986
6987 if (location == -1)
6988 {
6989 return;
6990 }
6991
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006992 gl::Context *context = gl::getNonLostContext();
6993
6994 if (context)
6995 {
6996 if (context->getClientVersion() < 3)
6997 {
6998 return gl::error(GL_INVALID_OPERATION);
6999 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007000
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007001 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7002 if (!programBinary)
7003 {
7004 return gl::error(GL_INVALID_OPERATION);
7005 }
7006
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007007 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007008 {
7009 return gl::error(GL_INVALID_OPERATION);
7010 }
7011 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007012 }
7013 catch(std::bad_alloc&)
7014 {
7015 return gl::error(GL_OUT_OF_MEMORY);
7016 }
7017}
7018
7019void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7020{
7021 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7022 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7023 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7024
7025 try
7026 {
7027 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007028 if (context)
7029 {
7030 if (context->getClientVersion() < 3)
7031 {
7032 return gl::error(GL_INVALID_OPERATION);
7033 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007034
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007035 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007036 dstX0, dstY0, dstX1, dstY1, mask, filter,
7037 false))
7038 {
7039 return;
7040 }
7041
7042 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7043 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007045 }
7046 catch(std::bad_alloc&)
7047 {
7048 return gl::error(GL_OUT_OF_MEMORY);
7049 }
7050}
7051
7052void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7053{
7054 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7055 target, samples, internalformat, width, height);
7056
7057 try
7058 {
7059 gl::Context *context = gl::getNonLostContext();
7060
7061 if (context)
7062 {
7063 if (context->getClientVersion() < 3)
7064 {
7065 return gl::error(GL_INVALID_OPERATION);
7066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007067
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007068 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007069 width, height, false))
7070 {
7071 return;
7072 }
7073
7074 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076 }
7077 catch(std::bad_alloc&)
7078 {
7079 return gl::error(GL_OUT_OF_MEMORY);
7080 }
7081}
7082
7083void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7084{
7085 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7086 target, attachment, texture, level, layer);
7087
7088 try
7089 {
7090 gl::Context *context = gl::getNonLostContext();
7091
7092 if (context)
7093 {
7094 if (context->getClientVersion() < 3)
7095 {
7096 return gl::error(GL_INVALID_OPERATION);
7097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007098
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007099 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007100 {
7101 return;
7102 }
7103
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007104 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7105 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007106
7107 gl::Texture *textureObject = context->getTexture(texture);
7108 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7109
7110 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7111 {
7112 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7113 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7114 }
7115 else
7116 {
7117 switch (attachment)
7118 {
7119 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7120 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7121 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7122 }
7123 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007124 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007125 }
7126 catch(std::bad_alloc&)
7127 {
7128 return gl::error(GL_OUT_OF_MEMORY);
7129 }
7130}
7131
7132GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7133{
7134 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7135 target, offset, length, access);
7136
7137 try
7138 {
7139 gl::Context *context = gl::getNonLostContext();
7140
7141 if (context)
7142 {
7143 if (context->getClientVersion() < 3)
7144 {
7145 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007147
Shannon Woods916e7692014-03-27 16:58:22 -04007148 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007150 }
7151 catch(std::bad_alloc&)
7152 {
7153 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7154 }
7155
7156 return NULL;
7157}
7158
7159void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7160{
7161 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7162
7163 try
7164 {
7165 gl::Context *context = gl::getNonLostContext();
7166
7167 if (context)
7168 {
7169 if (context->getClientVersion() < 3)
7170 {
7171 return gl::error(GL_INVALID_OPERATION);
7172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007173
Shannon Woods916e7692014-03-27 16:58:22 -04007174 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007176 }
7177 catch(std::bad_alloc&)
7178 {
7179 return gl::error(GL_OUT_OF_MEMORY);
7180 }
7181}
7182
7183void __stdcall glBindVertexArray(GLuint array)
7184{
7185 EVENT("(GLuint array = %u)", array);
7186
7187 try
7188 {
7189 gl::Context *context = gl::getNonLostContext();
7190
7191 if (context)
7192 {
7193 if (context->getClientVersion() < 3)
7194 {
7195 return gl::error(GL_INVALID_OPERATION);
7196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007197
Jamie Madilld1028542013-07-02 11:57:04 -04007198 gl::VertexArray *vao = context->getVertexArray(array);
7199
7200 if (!vao)
7201 {
7202 // The default VAO should always exist
7203 ASSERT(array != 0);
7204 return gl::error(GL_INVALID_OPERATION);
7205 }
7206
7207 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007209 }
7210 catch(std::bad_alloc&)
7211 {
7212 return gl::error(GL_OUT_OF_MEMORY);
7213 }
7214}
7215
7216void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7217{
7218 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7219
7220 try
7221 {
7222 gl::Context *context = gl::getNonLostContext();
7223
7224 if (context)
7225 {
7226 if (context->getClientVersion() < 3)
7227 {
7228 return gl::error(GL_INVALID_OPERATION);
7229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007230
Jamie Madilld1028542013-07-02 11:57:04 -04007231 if (n < 0)
7232 {
7233 return gl::error(GL_INVALID_VALUE);
7234 }
7235
7236 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7237 {
7238 if (arrays[arrayIndex] != 0)
7239 {
7240 context->deleteVertexArray(arrays[arrayIndex]);
7241 }
7242 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007244 }
7245 catch(std::bad_alloc&)
7246 {
7247 return gl::error(GL_OUT_OF_MEMORY);
7248 }
7249}
7250
7251void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7252{
7253 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7254
7255 try
7256 {
7257 gl::Context *context = gl::getNonLostContext();
7258
7259 if (context)
7260 {
7261 if (context->getClientVersion() < 3)
7262 {
7263 return gl::error(GL_INVALID_OPERATION);
7264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007265
Jamie Madilld1028542013-07-02 11:57:04 -04007266 if (n < 0)
7267 {
7268 return gl::error(GL_INVALID_VALUE);
7269 }
7270
7271 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7272 {
7273 arrays[arrayIndex] = context->createVertexArray();
7274 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007276 }
7277 catch(std::bad_alloc&)
7278 {
7279 return gl::error(GL_OUT_OF_MEMORY);
7280 }
7281}
7282
7283GLboolean __stdcall glIsVertexArray(GLuint array)
7284{
7285 EVENT("(GLuint array = %u)", array);
7286
7287 try
7288 {
7289 gl::Context *context = gl::getNonLostContext();
7290
7291 if (context)
7292 {
7293 if (context->getClientVersion() < 3)
7294 {
7295 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007297
Jamie Madilld1028542013-07-02 11:57:04 -04007298 if (array == 0)
7299 {
7300 return GL_FALSE;
7301 }
7302
7303 gl::VertexArray *vao = context->getVertexArray(array);
7304
7305 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007307 }
7308 catch(std::bad_alloc&)
7309 {
7310 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7311 }
7312
7313 return GL_FALSE;
7314}
7315
7316void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7317{
7318 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7319 target, index, data);
7320
7321 try
7322 {
7323 gl::Context *context = gl::getNonLostContext();
7324
7325 if (context)
7326 {
7327 if (context->getClientVersion() < 3)
7328 {
7329 return gl::error(GL_INVALID_OPERATION);
7330 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007331
Shannon Woods15934d52013-08-19 14:28:49 -04007332 switch (target)
7333 {
7334 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7335 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7336 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7337 if (index >= context->getMaxTransformFeedbackBufferBindings())
7338 return gl::error(GL_INVALID_VALUE);
7339 break;
7340 case GL_UNIFORM_BUFFER_START:
7341 case GL_UNIFORM_BUFFER_SIZE:
7342 case GL_UNIFORM_BUFFER_BINDING:
7343 if (index >= context->getMaximumCombinedUniformBufferBindings())
7344 return gl::error(GL_INVALID_VALUE);
7345 break;
7346 default:
7347 return gl::error(GL_INVALID_ENUM);
7348 }
7349
7350 if (!(context->getIndexedIntegerv(target, index, data)))
7351 {
7352 GLenum nativeType;
7353 unsigned int numParams = 0;
7354 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7355 return gl::error(GL_INVALID_ENUM);
7356
7357 if (numParams == 0)
7358 return; // it is known that pname is valid, but there are no parameters to return
7359
7360 if (nativeType == GL_INT_64_ANGLEX)
7361 {
7362 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7363 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7364 GLint64 *int64Params = new GLint64[numParams];
7365
7366 context->getIndexedInteger64v(target, index, int64Params);
7367
7368 for (unsigned int i = 0; i < numParams; ++i)
7369 {
7370 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7371 data[i] = static_cast<GLint>(clampedValue);
7372 }
7373
7374 delete [] int64Params;
7375 }
7376 else
7377 {
7378 UNREACHABLE();
7379 }
7380 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007381 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007382 }
7383 catch(std::bad_alloc&)
7384 {
7385 return gl::error(GL_OUT_OF_MEMORY);
7386 }
7387}
7388
7389void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7390{
7391 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7392
7393 try
7394 {
7395 gl::Context *context = gl::getNonLostContext();
7396
7397 if (context)
7398 {
7399 if (context->getClientVersion() < 3)
7400 {
7401 return gl::error(GL_INVALID_OPERATION);
7402 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007403
Geoff Langc8058452014-02-03 12:04:11 -05007404 switch (primitiveMode)
7405 {
7406 case GL_TRIANGLES:
7407 case GL_LINES:
7408 case GL_POINTS:
7409 break;
7410 default:
7411 return gl::error(GL_INVALID_ENUM);
7412 }
7413
7414 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7415 ASSERT(transformFeedback != NULL);
7416
7417 if (transformFeedback->isStarted())
7418 {
7419 return gl::error(GL_INVALID_OPERATION);
7420 }
7421
7422 if (transformFeedback->isPaused())
7423 {
7424 transformFeedback->resume();
7425 }
7426 else
7427 {
7428 transformFeedback->start(primitiveMode);
7429 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007430 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007431 }
7432 catch(std::bad_alloc&)
7433 {
7434 return gl::error(GL_OUT_OF_MEMORY);
7435 }
7436}
7437
7438void __stdcall glEndTransformFeedback(void)
7439{
7440 EVENT("(void)");
7441
7442 try
7443 {
7444 gl::Context *context = gl::getNonLostContext();
7445
7446 if (context)
7447 {
7448 if (context->getClientVersion() < 3)
7449 {
7450 return gl::error(GL_INVALID_OPERATION);
7451 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007452
Geoff Langc8058452014-02-03 12:04:11 -05007453 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7454 ASSERT(transformFeedback != NULL);
7455
7456 if (!transformFeedback->isStarted())
7457 {
7458 return gl::error(GL_INVALID_OPERATION);
7459 }
7460
7461 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007462 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007463 }
7464 catch(std::bad_alloc&)
7465 {
7466 return gl::error(GL_OUT_OF_MEMORY);
7467 }
7468}
7469
7470void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7471{
7472 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7473 target, index, buffer, offset, size);
7474
7475 try
7476 {
7477 gl::Context *context = gl::getNonLostContext();
7478
7479 if (context)
7480 {
7481 if (context->getClientVersion() < 3)
7482 {
7483 return gl::error(GL_INVALID_OPERATION);
7484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007485
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007486 switch (target)
7487 {
7488 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007489 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007490 {
7491 return gl::error(GL_INVALID_VALUE);
7492 }
7493 break;
7494
7495 case GL_UNIFORM_BUFFER:
7496 if (index >= context->getMaximumCombinedUniformBufferBindings())
7497 {
7498 return gl::error(GL_INVALID_VALUE);
7499 }
7500 break;
7501
7502 default:
7503 return gl::error(GL_INVALID_ENUM);
7504 }
7505
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007506 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007507 {
7508 return gl::error(GL_INVALID_VALUE);
7509 }
7510
7511 switch (target)
7512 {
7513 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007514
7515 // size and offset must be a multiple of 4
7516 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7517 {
7518 return gl::error(GL_INVALID_VALUE);
7519 }
7520
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007521 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7522 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007523 break;
7524
7525 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007526
7527 // it is an error to bind an offset not a multiple of the alignment
7528 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7529 {
7530 return gl::error(GL_INVALID_VALUE);
7531 }
7532
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007533 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7534 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007535 break;
7536
7537 default:
7538 UNREACHABLE();
7539 }
7540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007541 }
7542 catch(std::bad_alloc&)
7543 {
7544 return gl::error(GL_OUT_OF_MEMORY);
7545 }
7546}
7547
7548void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7549{
7550 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7551 target, index, buffer);
7552
7553 try
7554 {
7555 gl::Context *context = gl::getNonLostContext();
7556
7557 if (context)
7558 {
7559 if (context->getClientVersion() < 3)
7560 {
7561 return gl::error(GL_INVALID_OPERATION);
7562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007564 switch (target)
7565 {
7566 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007567 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007568 {
7569 return gl::error(GL_INVALID_VALUE);
7570 }
7571 break;
7572
7573 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007574 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007575 {
7576 return gl::error(GL_INVALID_VALUE);
7577 }
7578 break;
7579
7580 default:
7581 return gl::error(GL_INVALID_ENUM);
7582 }
7583
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007584 switch (target)
7585 {
7586 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007587 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007588 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007589 break;
7590
7591 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007592 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007593 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007594 break;
7595
7596 default:
7597 UNREACHABLE();
7598 }
7599 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007600 }
7601 catch(std::bad_alloc&)
7602 {
7603 return gl::error(GL_OUT_OF_MEMORY);
7604 }
7605}
7606
7607void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7608{
7609 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7610 program, count, varyings, bufferMode);
7611
7612 try
7613 {
7614 gl::Context *context = gl::getNonLostContext();
7615
7616 if (context)
7617 {
7618 if (context->getClientVersion() < 3)
7619 {
7620 return gl::error(GL_INVALID_OPERATION);
7621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007622
Geoff Lang48dcae72014-02-05 16:28:24 -05007623 if (count < 0)
7624 {
7625 return gl::error(GL_INVALID_VALUE);
7626 }
7627
7628 switch (bufferMode)
7629 {
7630 case GL_INTERLEAVED_ATTRIBS:
7631 break;
7632 case GL_SEPARATE_ATTRIBS:
7633 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7634 {
7635 return gl::error(GL_INVALID_VALUE);
7636 }
7637 break;
7638 default:
7639 return gl::error(GL_INVALID_ENUM);
7640 }
7641
7642 if (!gl::ValidProgram(context, program))
7643 {
7644 return;
7645 }
7646
7647 gl::Program *programObject = context->getProgram(program);
7648 ASSERT(programObject);
7649
7650 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007652 }
7653 catch(std::bad_alloc&)
7654 {
7655 return gl::error(GL_OUT_OF_MEMORY);
7656 }
7657}
7658
7659void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7660{
7661 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7662 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7663 program, index, bufSize, length, size, type, name);
7664
7665 try
7666 {
7667 gl::Context *context = gl::getNonLostContext();
7668
7669 if (context)
7670 {
7671 if (context->getClientVersion() < 3)
7672 {
7673 return gl::error(GL_INVALID_OPERATION);
7674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007675
Geoff Lang48dcae72014-02-05 16:28:24 -05007676 if (bufSize < 0)
7677 {
7678 return gl::error(GL_INVALID_VALUE);
7679 }
7680
7681 if (!gl::ValidProgram(context, program))
7682 {
7683 return;
7684 }
7685
7686 gl::Program *programObject = context->getProgram(program);
7687 ASSERT(programObject);
7688
7689 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7690 {
7691 return gl::error(GL_INVALID_VALUE);
7692 }
7693
7694 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007696 }
7697 catch(std::bad_alloc&)
7698 {
7699 return gl::error(GL_OUT_OF_MEMORY);
7700 }
7701}
7702
7703void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7704{
7705 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7706 index, size, type, stride, pointer);
7707
7708 try
7709 {
7710 gl::Context *context = gl::getNonLostContext();
7711
7712 if (context)
7713 {
7714 if (context->getClientVersion() < 3)
7715 {
7716 return gl::error(GL_INVALID_OPERATION);
7717 }
7718 }
7719
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007720 if (index >= gl::MAX_VERTEX_ATTRIBS)
7721 {
7722 return gl::error(GL_INVALID_VALUE);
7723 }
7724
7725 if (size < 1 || size > 4)
7726 {
7727 return gl::error(GL_INVALID_VALUE);
7728 }
7729
7730 switch (type)
7731 {
7732 case GL_BYTE:
7733 case GL_UNSIGNED_BYTE:
7734 case GL_SHORT:
7735 case GL_UNSIGNED_SHORT:
7736 case GL_INT:
7737 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007738 case GL_INT_2_10_10_10_REV:
7739 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007740 break;
7741 default:
7742 return gl::error(GL_INVALID_ENUM);
7743 }
7744
7745 if (stride < 0)
7746 {
7747 return gl::error(GL_INVALID_VALUE);
7748 }
7749
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007750 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7751 {
7752 return gl::error(GL_INVALID_OPERATION);
7753 }
7754
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007755 if (context)
7756 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007757 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7758 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7759 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7760 // and the pointer argument is not NULL.
7761 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7762 {
7763 return gl::error(GL_INVALID_OPERATION);
7764 }
7765
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007766 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7767 stride, pointer);
7768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007769 }
7770 catch(std::bad_alloc&)
7771 {
7772 return gl::error(GL_OUT_OF_MEMORY);
7773 }
7774}
7775
7776void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7777{
7778 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7779 index, pname, params);
7780
7781 try
7782 {
7783 gl::Context *context = gl::getNonLostContext();
7784
7785 if (context)
7786 {
7787 if (context->getClientVersion() < 3)
7788 {
7789 return gl::error(GL_INVALID_OPERATION);
7790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007791
Jamie Madilla7d05862013-07-02 11:57:06 -04007792 if (index >= gl::MAX_VERTEX_ATTRIBS)
7793 {
7794 return gl::error(GL_INVALID_VALUE);
7795 }
7796
7797 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7798
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007799 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007800 {
7801 return;
7802 }
7803
7804 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7805 {
7806 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7807 for (int i = 0; i < 4; ++i)
7808 {
7809 params[i] = currentValueData.IntValues[i];
7810 }
7811 }
7812 else
7813 {
7814 *params = attribState.querySingleParameter<GLint>(pname);
7815 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007817 }
7818 catch(std::bad_alloc&)
7819 {
7820 return gl::error(GL_OUT_OF_MEMORY);
7821 }
7822}
7823
7824void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7825{
7826 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7827 index, pname, params);
7828
7829 try
7830 {
7831 gl::Context *context = gl::getNonLostContext();
7832
7833 if (context)
7834 {
7835 if (context->getClientVersion() < 3)
7836 {
7837 return gl::error(GL_INVALID_OPERATION);
7838 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007839
Jamie Madilla7d05862013-07-02 11:57:06 -04007840 if (index >= gl::MAX_VERTEX_ATTRIBS)
7841 {
7842 return gl::error(GL_INVALID_VALUE);
7843 }
7844
7845 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7846
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007847 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007848 {
7849 return;
7850 }
7851
7852 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7853 {
7854 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7855 for (int i = 0; i < 4; ++i)
7856 {
7857 params[i] = currentValueData.UnsignedIntValues[i];
7858 }
7859 }
7860 else
7861 {
7862 *params = attribState.querySingleParameter<GLuint>(pname);
7863 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007865 }
7866 catch(std::bad_alloc&)
7867 {
7868 return gl::error(GL_OUT_OF_MEMORY);
7869 }
7870}
7871
7872void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7873{
7874 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7875 index, x, y, z, w);
7876
7877 try
7878 {
7879 gl::Context *context = gl::getNonLostContext();
7880
7881 if (context)
7882 {
7883 if (context->getClientVersion() < 3)
7884 {
7885 return gl::error(GL_INVALID_OPERATION);
7886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007887
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007888 if (index >= gl::MAX_VERTEX_ATTRIBS)
7889 {
7890 return gl::error(GL_INVALID_VALUE);
7891 }
7892
7893 GLint vals[4] = { x, y, z, w };
7894 context->setVertexAttribi(index, vals);
7895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007896 }
7897 catch(std::bad_alloc&)
7898 {
7899 return gl::error(GL_OUT_OF_MEMORY);
7900 }
7901}
7902
7903void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7904{
7905 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7906 index, x, y, z, w);
7907
7908 try
7909 {
7910 gl::Context *context = gl::getNonLostContext();
7911
7912 if (context)
7913 {
7914 if (context->getClientVersion() < 3)
7915 {
7916 return gl::error(GL_INVALID_OPERATION);
7917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007918
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007919 if (index >= gl::MAX_VERTEX_ATTRIBS)
7920 {
7921 return gl::error(GL_INVALID_VALUE);
7922 }
7923
7924 GLuint vals[4] = { x, y, z, w };
7925 context->setVertexAttribu(index, vals);
7926 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007927 }
7928 catch(std::bad_alloc&)
7929 {
7930 return gl::error(GL_OUT_OF_MEMORY);
7931 }
7932}
7933
7934void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7935{
7936 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7937
7938 try
7939 {
7940 gl::Context *context = gl::getNonLostContext();
7941
7942 if (context)
7943 {
7944 if (context->getClientVersion() < 3)
7945 {
7946 return gl::error(GL_INVALID_OPERATION);
7947 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007948
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007949 if (index >= gl::MAX_VERTEX_ATTRIBS)
7950 {
7951 return gl::error(GL_INVALID_VALUE);
7952 }
7953
7954 context->setVertexAttribi(index, v);
7955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007956 }
7957 catch(std::bad_alloc&)
7958 {
7959 return gl::error(GL_OUT_OF_MEMORY);
7960 }
7961}
7962
7963void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7964{
7965 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7966
7967 try
7968 {
7969 gl::Context *context = gl::getNonLostContext();
7970
7971 if (context)
7972 {
7973 if (context->getClientVersion() < 3)
7974 {
7975 return gl::error(GL_INVALID_OPERATION);
7976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007977
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007978 if (index >= gl::MAX_VERTEX_ATTRIBS)
7979 {
7980 return gl::error(GL_INVALID_VALUE);
7981 }
7982
7983 context->setVertexAttribu(index, v);
7984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007985 }
7986 catch(std::bad_alloc&)
7987 {
7988 return gl::error(GL_OUT_OF_MEMORY);
7989 }
7990}
7991
7992void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7993{
7994 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7995 program, location, params);
7996
7997 try
7998 {
7999 gl::Context *context = gl::getNonLostContext();
8000
8001 if (context)
8002 {
8003 if (context->getClientVersion() < 3)
8004 {
8005 return gl::error(GL_INVALID_OPERATION);
8006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008007
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008008 if (program == 0)
8009 {
8010 return gl::error(GL_INVALID_VALUE);
8011 }
8012
8013 gl::Program *programObject = context->getProgram(program);
8014
8015 if (!programObject || !programObject->isLinked())
8016 {
8017 return gl::error(GL_INVALID_OPERATION);
8018 }
8019
8020 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8021 if (!programBinary)
8022 {
8023 return gl::error(GL_INVALID_OPERATION);
8024 }
8025
8026 if (!programBinary->getUniformuiv(location, NULL, params))
8027 {
8028 return gl::error(GL_INVALID_OPERATION);
8029 }
8030 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008031 }
8032 catch(std::bad_alloc&)
8033 {
8034 return gl::error(GL_OUT_OF_MEMORY);
8035 }
8036}
8037
8038GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8039{
8040 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8041 program, name);
8042
8043 try
8044 {
8045 gl::Context *context = gl::getNonLostContext();
8046
8047 if (context)
8048 {
8049 if (context->getClientVersion() < 3)
8050 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008051 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008052 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008053
Jamie Madilld1e78c92013-06-20 11:55:50 -04008054 if (program == 0)
8055 {
8056 return gl::error(GL_INVALID_VALUE, -1);
8057 }
8058
8059 gl::Program *programObject = context->getProgram(program);
8060
8061 if (!programObject || !programObject->isLinked())
8062 {
8063 return gl::error(GL_INVALID_OPERATION, -1);
8064 }
8065
8066 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8067 if (!programBinary)
8068 {
8069 return gl::error(GL_INVALID_OPERATION, -1);
8070 }
8071
8072 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008073 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008074 }
8075 catch(std::bad_alloc&)
8076 {
8077 return gl::error(GL_OUT_OF_MEMORY, 0);
8078 }
8079
8080 return 0;
8081}
8082
8083void __stdcall glUniform1ui(GLint location, GLuint v0)
8084{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008085 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008086}
8087
8088void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8089{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008090 const GLuint xy[] = { v0, v1 };
8091 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008092}
8093
8094void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8095{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008096 const GLuint xyz[] = { v0, v1, v2 };
8097 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008098}
8099
8100void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8101{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008102 const GLuint xyzw[] = { v0, v1, v2, v3 };
8103 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008104}
8105
8106void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8107{
8108 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8109 location, count, value);
8110
8111 try
8112 {
8113 gl::Context *context = gl::getNonLostContext();
8114
8115 if (context)
8116 {
8117 if (context->getClientVersion() < 3)
8118 {
8119 return gl::error(GL_INVALID_OPERATION);
8120 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008121
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008122 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8123 if (!programBinary)
8124 {
8125 return gl::error(GL_INVALID_OPERATION);
8126 }
8127
8128 if (!programBinary->setUniform1uiv(location, count, value))
8129 {
8130 return gl::error(GL_INVALID_OPERATION);
8131 }
8132 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008133 }
8134 catch(std::bad_alloc&)
8135 {
8136 return gl::error(GL_OUT_OF_MEMORY);
8137 }
8138}
8139
8140void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8141{
8142 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8143 location, count, value);
8144
8145 try
8146 {
8147 gl::Context *context = gl::getNonLostContext();
8148
8149 if (context)
8150 {
8151 if (context->getClientVersion() < 3)
8152 {
8153 return gl::error(GL_INVALID_OPERATION);
8154 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008155
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008156 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8157 if (!programBinary)
8158 {
8159 return gl::error(GL_INVALID_OPERATION);
8160 }
8161
8162 if (!programBinary->setUniform2uiv(location, count, value))
8163 {
8164 return gl::error(GL_INVALID_OPERATION);
8165 }
8166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008167 }
8168 catch(std::bad_alloc&)
8169 {
8170 return gl::error(GL_OUT_OF_MEMORY);
8171 }
8172}
8173
8174void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8175{
8176 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8177 location, count, value);
8178
8179 try
8180 {
8181 gl::Context *context = gl::getNonLostContext();
8182
8183 if (context)
8184 {
8185 if (context->getClientVersion() < 3)
8186 {
8187 return gl::error(GL_INVALID_OPERATION);
8188 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008189
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008190 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8191 if (!programBinary)
8192 {
8193 return gl::error(GL_INVALID_OPERATION);
8194 }
8195
8196 if (!programBinary->setUniform3uiv(location, count, value))
8197 {
8198 return gl::error(GL_INVALID_OPERATION);
8199 }
8200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008201 }
8202 catch(std::bad_alloc&)
8203 {
8204 return gl::error(GL_OUT_OF_MEMORY);
8205 }
8206}
8207
8208void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8209{
8210 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8211 location, count, value);
8212
8213 try
8214 {
8215 gl::Context *context = gl::getNonLostContext();
8216
8217 if (context)
8218 {
8219 if (context->getClientVersion() < 3)
8220 {
8221 return gl::error(GL_INVALID_OPERATION);
8222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008223
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008224 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8225 if (!programBinary)
8226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
8229
8230 if (!programBinary->setUniform4uiv(location, count, value))
8231 {
8232 return gl::error(GL_INVALID_OPERATION);
8233 }
8234 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008235 }
8236 catch(std::bad_alloc&)
8237 {
8238 return gl::error(GL_OUT_OF_MEMORY);
8239 }
8240}
8241
8242void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8243{
8244 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8245 buffer, drawbuffer, value);
8246
8247 try
8248 {
8249 gl::Context *context = gl::getNonLostContext();
8250
8251 if (context)
8252 {
8253 if (context->getClientVersion() < 3)
8254 {
8255 return gl::error(GL_INVALID_OPERATION);
8256 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008257
Geoff Lang42359ca2013-08-21 13:25:17 -04008258 switch (buffer)
8259 {
8260 case GL_COLOR:
8261 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8262 {
8263 return gl::error(GL_INVALID_VALUE);
8264 }
8265 break;
8266 case GL_STENCIL:
8267 if (drawbuffer != 0)
8268 {
8269 return gl::error(GL_INVALID_VALUE);
8270 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008271 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008272 default:
8273 return gl::error(GL_INVALID_ENUM);
8274 }
8275
8276 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008278 }
8279 catch(std::bad_alloc&)
8280 {
8281 return gl::error(GL_OUT_OF_MEMORY);
8282 }
8283}
8284
8285void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8286{
8287 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8288 buffer, drawbuffer, value);
8289
8290 try
8291 {
8292 gl::Context *context = gl::getNonLostContext();
8293
8294 if (context)
8295 {
8296 if (context->getClientVersion() < 3)
8297 {
8298 return gl::error(GL_INVALID_OPERATION);
8299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008300
Geoff Lang42359ca2013-08-21 13:25:17 -04008301 switch (buffer)
8302 {
8303 case GL_COLOR:
8304 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8305 {
8306 return gl::error(GL_INVALID_VALUE);
8307 }
8308 break;
8309 default:
8310 return gl::error(GL_INVALID_ENUM);
8311 }
8312
8313 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008314 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008315 }
8316 catch(std::bad_alloc&)
8317 {
8318 return gl::error(GL_OUT_OF_MEMORY);
8319 }
8320}
8321
8322void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8323{
8324 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8325 buffer, drawbuffer, value);
8326
8327 try
8328 {
8329 gl::Context *context = gl::getNonLostContext();
8330
8331 if (context)
8332 {
8333 if (context->getClientVersion() < 3)
8334 {
8335 return gl::error(GL_INVALID_OPERATION);
8336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008337
Geoff Lang42359ca2013-08-21 13:25:17 -04008338 switch (buffer)
8339 {
8340 case GL_COLOR:
8341 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8342 {
8343 return gl::error(GL_INVALID_VALUE);
8344 }
8345 break;
8346 case GL_DEPTH:
8347 if (drawbuffer != 0)
8348 {
8349 return gl::error(GL_INVALID_VALUE);
8350 }
8351 break;
8352 default:
8353 return gl::error(GL_INVALID_ENUM);
8354 }
8355
8356 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008358 }
8359 catch(std::bad_alloc&)
8360 {
8361 return gl::error(GL_OUT_OF_MEMORY);
8362 }
8363}
8364
8365void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8366{
8367 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8368 buffer, drawbuffer, depth, stencil);
8369
8370 try
8371 {
8372 gl::Context *context = gl::getNonLostContext();
8373
8374 if (context)
8375 {
8376 if (context->getClientVersion() < 3)
8377 {
8378 return gl::error(GL_INVALID_OPERATION);
8379 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008380
Geoff Lang42359ca2013-08-21 13:25:17 -04008381 switch (buffer)
8382 {
8383 case GL_DEPTH_STENCIL:
8384 if (drawbuffer != 0)
8385 {
8386 return gl::error(GL_INVALID_VALUE);
8387 }
8388 break;
8389 default:
8390 return gl::error(GL_INVALID_ENUM);
8391 }
8392
8393 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008395 }
8396 catch(std::bad_alloc&)
8397 {
8398 return gl::error(GL_OUT_OF_MEMORY);
8399 }
8400}
8401
8402const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8403{
8404 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8405
8406 try
8407 {
8408 gl::Context *context = gl::getNonLostContext();
8409
8410 if (context)
8411 {
8412 if (context->getClientVersion() < 3)
8413 {
8414 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008416
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008417 if (name != GL_EXTENSIONS)
8418 {
8419 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8420 }
8421
8422 if (index >= context->getNumExtensions())
8423 {
8424 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8425 }
8426
8427 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008429 }
8430 catch(std::bad_alloc&)
8431 {
8432 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8433 }
8434
8435 return NULL;
8436}
8437
8438void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8439{
8440 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8441 readTarget, writeTarget, readOffset, writeOffset, size);
8442
8443 try
8444 {
8445 gl::Context *context = gl::getNonLostContext();
8446
8447 if (context)
8448 {
8449 if (context->getClientVersion() < 3)
8450 {
8451 return gl::error(GL_INVALID_OPERATION);
8452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008453
Jamie Madill8c96d582014-03-05 15:01:23 -05008454 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008455 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008456 return gl::error(GL_INVALID_ENUM);
8457 }
8458
Jamie Madill8c96d582014-03-05 15:01:23 -05008459 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8460 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008461
8462 if (!readBuffer || !writeBuffer)
8463 {
8464 return gl::error(GL_INVALID_OPERATION);
8465 }
8466
Jamie Madill7a5f7382014-03-05 15:01:24 -05008467 if (readBuffer->mapped() || writeBuffer->mapped())
8468 {
8469 return gl::error(GL_INVALID_OPERATION);
8470 }
8471
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008472 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8473 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8474 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8475 {
8476 return gl::error(GL_INVALID_VALUE);
8477 }
8478
8479 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8480 {
8481 return gl::error(GL_INVALID_VALUE);
8482 }
8483
8484 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8485
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008486 // if size is zero, the copy is a successful no-op
8487 if (size > 0)
8488 {
8489 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8490 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008491 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008492 }
8493 catch(std::bad_alloc&)
8494 {
8495 return gl::error(GL_OUT_OF_MEMORY);
8496 }
8497}
8498
8499void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8500{
8501 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8502 program, uniformCount, uniformNames, uniformIndices);
8503
8504 try
8505 {
8506 gl::Context *context = gl::getNonLostContext();
8507
8508 if (context)
8509 {
8510 if (context->getClientVersion() < 3)
8511 {
8512 return gl::error(GL_INVALID_OPERATION);
8513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008514
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008515 if (uniformCount < 0)
8516 {
8517 return gl::error(GL_INVALID_VALUE);
8518 }
8519
8520 gl::Program *programObject = context->getProgram(program);
8521
8522 if (!programObject)
8523 {
8524 if (context->getShader(program))
8525 {
8526 return gl::error(GL_INVALID_OPERATION);
8527 }
8528 else
8529 {
8530 return gl::error(GL_INVALID_VALUE);
8531 }
8532 }
8533
8534 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8535 if (!programObject->isLinked() || !programBinary)
8536 {
8537 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8538 {
8539 uniformIndices[uniformId] = GL_INVALID_INDEX;
8540 }
8541 }
8542 else
8543 {
8544 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8545 {
8546 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8547 }
8548 }
8549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008550 }
8551 catch(std::bad_alloc&)
8552 {
8553 return gl::error(GL_OUT_OF_MEMORY);
8554 }
8555}
8556
8557void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8558{
8559 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8560 program, uniformCount, uniformIndices, pname, params);
8561
8562 try
8563 {
8564 gl::Context *context = gl::getNonLostContext();
8565
8566 if (context)
8567 {
8568 if (context->getClientVersion() < 3)
8569 {
8570 return gl::error(GL_INVALID_OPERATION);
8571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008572
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008573 if (uniformCount < 0)
8574 {
8575 return gl::error(GL_INVALID_VALUE);
8576 }
8577
8578 gl::Program *programObject = context->getProgram(program);
8579
8580 if (!programObject)
8581 {
8582 if (context->getShader(program))
8583 {
8584 return gl::error(GL_INVALID_OPERATION);
8585 }
8586 else
8587 {
8588 return gl::error(GL_INVALID_VALUE);
8589 }
8590 }
8591
8592 switch (pname)
8593 {
8594 case GL_UNIFORM_TYPE:
8595 case GL_UNIFORM_SIZE:
8596 case GL_UNIFORM_NAME_LENGTH:
8597 case GL_UNIFORM_BLOCK_INDEX:
8598 case GL_UNIFORM_OFFSET:
8599 case GL_UNIFORM_ARRAY_STRIDE:
8600 case GL_UNIFORM_MATRIX_STRIDE:
8601 case GL_UNIFORM_IS_ROW_MAJOR:
8602 break;
8603 default:
8604 return gl::error(GL_INVALID_ENUM);
8605 }
8606
8607 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8608
8609 if (!programBinary && uniformCount > 0)
8610 {
8611 return gl::error(GL_INVALID_VALUE);
8612 }
8613
8614 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8615 {
8616 const GLuint index = uniformIndices[uniformId];
8617
8618 if (index >= (GLuint)programBinary->getActiveUniformCount())
8619 {
8620 return gl::error(GL_INVALID_VALUE);
8621 }
8622 }
8623
8624 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8625 {
8626 const GLuint index = uniformIndices[uniformId];
8627 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8628 }
8629 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008630 }
8631 catch(std::bad_alloc&)
8632 {
8633 return gl::error(GL_OUT_OF_MEMORY);
8634 }
8635}
8636
8637GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8638{
8639 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8640
8641 try
8642 {
8643 gl::Context *context = gl::getNonLostContext();
8644
8645 if (context)
8646 {
8647 if (context->getClientVersion() < 3)
8648 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008649 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008650 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008651
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008652 gl::Program *programObject = context->getProgram(program);
8653
8654 if (!programObject)
8655 {
8656 if (context->getShader(program))
8657 {
8658 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8659 }
8660 else
8661 {
8662 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8663 }
8664 }
8665
8666 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8667 if (!programBinary)
8668 {
8669 return GL_INVALID_INDEX;
8670 }
8671
8672 return programBinary->getUniformBlockIndex(uniformBlockName);
8673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008674 }
8675 catch(std::bad_alloc&)
8676 {
8677 return gl::error(GL_OUT_OF_MEMORY, 0);
8678 }
8679
8680 return 0;
8681}
8682
8683void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8684{
8685 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8686 program, uniformBlockIndex, pname, params);
8687
8688 try
8689 {
8690 gl::Context *context = gl::getNonLostContext();
8691
8692 if (context)
8693 {
8694 if (context->getClientVersion() < 3)
8695 {
8696 return gl::error(GL_INVALID_OPERATION);
8697 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008698 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008699
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008700 if (!programObject)
8701 {
8702 if (context->getShader(program))
8703 {
8704 return gl::error(GL_INVALID_OPERATION);
8705 }
8706 else
8707 {
8708 return gl::error(GL_INVALID_VALUE);
8709 }
8710 }
8711
8712 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8713
8714 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8715 {
8716 return gl::error(GL_INVALID_VALUE);
8717 }
8718
8719 switch (pname)
8720 {
8721 case GL_UNIFORM_BLOCK_BINDING:
8722 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8723 break;
8724
8725 case GL_UNIFORM_BLOCK_DATA_SIZE:
8726 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8727 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8728 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8729 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8730 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8731 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8732 break;
8733
8734 default:
8735 return gl::error(GL_INVALID_ENUM);
8736 }
8737 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008738 }
8739 catch(std::bad_alloc&)
8740 {
8741 return gl::error(GL_OUT_OF_MEMORY);
8742 }
8743}
8744
8745void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8746{
8747 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8748 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8749
8750 try
8751 {
8752 gl::Context *context = gl::getNonLostContext();
8753
8754 if (context)
8755 {
8756 if (context->getClientVersion() < 3)
8757 {
8758 return gl::error(GL_INVALID_OPERATION);
8759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008760
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008761 gl::Program *programObject = context->getProgram(program);
8762
8763 if (!programObject)
8764 {
8765 if (context->getShader(program))
8766 {
8767 return gl::error(GL_INVALID_OPERATION);
8768 }
8769 else
8770 {
8771 return gl::error(GL_INVALID_VALUE);
8772 }
8773 }
8774
8775 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8776
8777 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8778 {
8779 return gl::error(GL_INVALID_VALUE);
8780 }
8781
8782 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8783 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008784 }
8785 catch(std::bad_alloc&)
8786 {
8787 return gl::error(GL_OUT_OF_MEMORY);
8788 }
8789}
8790
8791void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8792{
8793 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8794 program, uniformBlockIndex, uniformBlockBinding);
8795
8796 try
8797 {
8798 gl::Context *context = gl::getNonLostContext();
8799
8800 if (context)
8801 {
8802 if (context->getClientVersion() < 3)
8803 {
8804 return gl::error(GL_INVALID_OPERATION);
8805 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008806
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008807 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8808 {
8809 return gl::error(GL_INVALID_VALUE);
8810 }
8811
8812 gl::Program *programObject = context->getProgram(program);
8813
8814 if (!programObject)
8815 {
8816 if (context->getShader(program))
8817 {
8818 return gl::error(GL_INVALID_OPERATION);
8819 }
8820 else
8821 {
8822 return gl::error(GL_INVALID_VALUE);
8823 }
8824 }
8825
8826 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8827
8828 // if never linked, there won't be any uniform blocks
8829 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8830 {
8831 return gl::error(GL_INVALID_VALUE);
8832 }
8833
8834 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008836 }
8837 catch(std::bad_alloc&)
8838 {
8839 return gl::error(GL_OUT_OF_MEMORY);
8840 }
8841}
8842
8843void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8844{
8845 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8846 mode, first, count, instanceCount);
8847
8848 try
8849 {
8850 gl::Context *context = gl::getNonLostContext();
8851
8852 if (context)
8853 {
8854 if (context->getClientVersion() < 3)
8855 {
8856 return gl::error(GL_INVALID_OPERATION);
8857 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008858
Jamie Madill54133512013-06-21 09:33:07 -04008859 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008860 UNIMPLEMENTED();
8861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008862 }
8863 catch(std::bad_alloc&)
8864 {
8865 return gl::error(GL_OUT_OF_MEMORY);
8866 }
8867}
8868
8869void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8870{
8871 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8872 mode, count, type, indices, instanceCount);
8873
8874 try
8875 {
8876 gl::Context *context = gl::getNonLostContext();
8877
8878 if (context)
8879 {
8880 if (context->getClientVersion() < 3)
8881 {
8882 return gl::error(GL_INVALID_OPERATION);
8883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008884
Jamie Madill54133512013-06-21 09:33:07 -04008885 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008886 UNIMPLEMENTED();
8887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008888 }
8889 catch(std::bad_alloc&)
8890 {
8891 return gl::error(GL_OUT_OF_MEMORY);
8892 }
8893}
8894
8895GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8896{
8897 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8898
8899 try
8900 {
8901 gl::Context *context = gl::getNonLostContext();
8902
8903 if (context)
8904 {
8905 if (context->getClientVersion() < 3)
8906 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008907 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008909
Jamie Madill5215e1a2013-07-26 11:55:19 -04008910 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8911 {
8912 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8913 }
8914
8915 if (flags != 0)
8916 {
8917 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8918 }
8919
8920 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008922 }
8923 catch(std::bad_alloc&)
8924 {
8925 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8926 }
8927
8928 return NULL;
8929}
8930
8931GLboolean __stdcall glIsSync(GLsync sync)
8932{
8933 EVENT("(GLsync sync = 0x%0.8p)", sync);
8934
8935 try
8936 {
8937 gl::Context *context = gl::getNonLostContext();
8938
8939 if (context)
8940 {
8941 if (context->getClientVersion() < 3)
8942 {
8943 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008945
Jamie Madill5215e1a2013-07-26 11:55:19 -04008946 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008947 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008948 }
8949 catch(std::bad_alloc&)
8950 {
8951 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8952 }
8953
8954 return GL_FALSE;
8955}
8956
8957void __stdcall glDeleteSync(GLsync sync)
8958{
8959 EVENT("(GLsync sync = 0x%0.8p)", sync);
8960
8961 try
8962 {
8963 gl::Context *context = gl::getNonLostContext();
8964
8965 if (context)
8966 {
8967 if (context->getClientVersion() < 3)
8968 {
8969 return gl::error(GL_INVALID_OPERATION);
8970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008971
Jamie Madill5215e1a2013-07-26 11:55:19 -04008972 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8973 {
8974 return gl::error(GL_INVALID_VALUE);
8975 }
8976
8977 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008979 }
8980 catch(std::bad_alloc&)
8981 {
8982 return gl::error(GL_OUT_OF_MEMORY);
8983 }
8984}
8985
8986GLenum __stdcall glClientWaitSync(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 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008999 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009001
Jamie Madill5215e1a2013-07-26 11:55:19 -04009002 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9003 {
9004 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9005 }
9006
9007 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9008
9009 if (!fenceSync)
9010 {
9011 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9012 }
9013
9014 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009015 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016 }
9017 catch(std::bad_alloc&)
9018 {
9019 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9020 }
9021
9022 return GL_FALSE;
9023}
9024
9025void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9026{
9027 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9028 sync, flags, timeout);
9029
9030 try
9031 {
9032 gl::Context *context = gl::getNonLostContext();
9033
9034 if (context)
9035 {
9036 if (context->getClientVersion() < 3)
9037 {
9038 return gl::error(GL_INVALID_OPERATION);
9039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009040
Jamie Madill5215e1a2013-07-26 11:55:19 -04009041 if (flags != 0)
9042 {
9043 return gl::error(GL_INVALID_VALUE);
9044 }
9045
9046 if (timeout != GL_TIMEOUT_IGNORED)
9047 {
9048 return gl::error(GL_INVALID_VALUE);
9049 }
9050
9051 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9052
9053 if (!fenceSync)
9054 {
9055 return gl::error(GL_INVALID_VALUE);
9056 }
9057
9058 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060 }
9061 catch(std::bad_alloc&)
9062 {
9063 return gl::error(GL_OUT_OF_MEMORY);
9064 }
9065}
9066
9067void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9068{
9069 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9070 pname, params);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082
Jamie Madill79f2f452013-12-19 11:13:02 -05009083 GLenum nativeType;
9084 unsigned int numParams = 0;
9085 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9086 return gl::error(GL_INVALID_ENUM);
9087
9088 // pname is valid, but that there are no parameters to return.
9089 if (numParams == 0)
9090 return;
9091
9092 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009093 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009094 context->getInteger64v(pname, params);
9095 }
Jamie Madill55856b12014-01-02 13:59:50 -05009096 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009097 {
Jamie Madill55856b12014-01-02 13:59:50 -05009098 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009099 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009101 }
9102 catch(std::bad_alloc&)
9103 {
9104 return gl::error(GL_OUT_OF_MEMORY);
9105 }
9106}
9107
9108void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9109{
9110 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9111 sync, pname, bufSize, length, values);
9112
9113 try
9114 {
9115 gl::Context *context = gl::getNonLostContext();
9116
9117 if (context)
9118 {
9119 if (context->getClientVersion() < 3)
9120 {
9121 return gl::error(GL_INVALID_OPERATION);
9122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009123
Jamie Madill5215e1a2013-07-26 11:55:19 -04009124 if (bufSize < 0)
9125 {
9126 return gl::error(GL_INVALID_VALUE);
9127 }
9128
9129 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9130
9131 if (!fenceSync)
9132 {
9133 return gl::error(GL_INVALID_VALUE);
9134 }
9135
9136 switch (pname)
9137 {
9138 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9139 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9140 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9141 case GL_SYNC_FLAGS: values[0] = 0; break;
9142
9143 default:
9144 return gl::error(GL_INVALID_ENUM);
9145 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009147 }
9148 catch(std::bad_alloc&)
9149 {
9150 return gl::error(GL_OUT_OF_MEMORY);
9151 }
9152}
9153
9154void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9155{
9156 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9157 target, index, data);
9158
9159 try
9160 {
9161 gl::Context *context = gl::getNonLostContext();
9162
9163 if (context)
9164 {
9165 if (context->getClientVersion() < 3)
9166 {
9167 return gl::error(GL_INVALID_OPERATION);
9168 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009169
Shannon Woods15934d52013-08-19 14:28:49 -04009170 switch (target)
9171 {
9172 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9173 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9174 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9175 if (index >= context->getMaxTransformFeedbackBufferBindings())
9176 return gl::error(GL_INVALID_VALUE);
9177 break;
9178 case GL_UNIFORM_BUFFER_START:
9179 case GL_UNIFORM_BUFFER_SIZE:
9180 case GL_UNIFORM_BUFFER_BINDING:
9181 if (index >= context->getMaximumCombinedUniformBufferBindings())
9182 return gl::error(GL_INVALID_VALUE);
9183 break;
9184 default:
9185 return gl::error(GL_INVALID_ENUM);
9186 }
9187
9188 if (!(context->getIndexedInteger64v(target, index, data)))
9189 {
9190 GLenum nativeType;
9191 unsigned int numParams = 0;
9192 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9193 return gl::error(GL_INVALID_ENUM);
9194
9195 if (numParams == 0)
9196 return; // it is known that pname is valid, but there are no parameters to return
9197
9198 if (nativeType == GL_INT)
9199 {
9200 GLint *intParams = new GLint[numParams];
9201
9202 context->getIndexedIntegerv(target, index, intParams);
9203
9204 for (unsigned int i = 0; i < numParams; ++i)
9205 {
9206 data[i] = static_cast<GLint64>(intParams[i]);
9207 }
9208
9209 delete [] intParams;
9210 }
9211 else
9212 {
9213 UNREACHABLE();
9214 }
9215 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009216 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009217 }
9218 catch(std::bad_alloc&)
9219 {
9220 return gl::error(GL_OUT_OF_MEMORY);
9221 }
9222}
9223
9224void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9225{
9226 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9227 target, pname, params);
9228
9229 try
9230 {
9231 gl::Context *context = gl::getNonLostContext();
9232
9233 if (context)
9234 {
9235 if (context->getClientVersion() < 3)
9236 {
9237 return gl::error(GL_INVALID_OPERATION);
9238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009239
Jamie Madill70656a62014-03-05 15:01:26 -05009240 if (!gl::ValidBufferTarget(context, target))
9241 {
9242 return gl::error(GL_INVALID_ENUM);
9243 }
9244
9245 if (!gl::ValidBufferParameter(context, pname))
9246 {
9247 return gl::error(GL_INVALID_ENUM);
9248 }
9249
9250 gl::Buffer *buffer = context->getTargetBuffer(target);
9251
9252 if (!buffer)
9253 {
9254 // A null buffer means that "0" is bound to the requested buffer target
9255 return gl::error(GL_INVALID_OPERATION);
9256 }
9257
9258 switch (pname)
9259 {
9260 case GL_BUFFER_USAGE:
9261 *params = static_cast<GLint64>(buffer->usage());
9262 break;
9263 case GL_BUFFER_SIZE:
9264 *params = buffer->size();
9265 break;
9266 case GL_BUFFER_ACCESS_FLAGS:
9267 *params = static_cast<GLint64>(buffer->accessFlags());
9268 break;
9269 case GL_BUFFER_MAPPED:
9270 *params = static_cast<GLint64>(buffer->mapped());
9271 break;
9272 case GL_BUFFER_MAP_OFFSET:
9273 *params = buffer->mapOffset();
9274 break;
9275 case GL_BUFFER_MAP_LENGTH:
9276 *params = buffer->mapLength();
9277 break;
9278 default: UNREACHABLE(); break;
9279 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009280 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009281 }
9282 catch(std::bad_alloc&)
9283 {
9284 return gl::error(GL_OUT_OF_MEMORY);
9285 }
9286}
9287
9288void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9289{
9290 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9291
9292 try
9293 {
9294 gl::Context *context = gl::getNonLostContext();
9295
9296 if (context)
9297 {
9298 if (context->getClientVersion() < 3)
9299 {
9300 return gl::error(GL_INVALID_OPERATION);
9301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009302
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009303 if (count < 0)
9304 {
9305 return gl::error(GL_INVALID_VALUE);
9306 }
9307
9308 for (int i = 0; i < count; i++)
9309 {
9310 samplers[i] = context->createSampler();
9311 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009313 }
9314 catch(std::bad_alloc&)
9315 {
9316 return gl::error(GL_OUT_OF_MEMORY);
9317 }
9318}
9319
9320void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9321{
9322 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9323
9324 try
9325 {
9326 gl::Context *context = gl::getNonLostContext();
9327
9328 if (context)
9329 {
9330 if (context->getClientVersion() < 3)
9331 {
9332 return gl::error(GL_INVALID_OPERATION);
9333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009334
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009335 if (count < 0)
9336 {
9337 return gl::error(GL_INVALID_VALUE);
9338 }
9339
9340 for (int i = 0; i < count; i++)
9341 {
9342 context->deleteSampler(samplers[i]);
9343 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009344 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009345 }
9346 catch(std::bad_alloc&)
9347 {
9348 return gl::error(GL_OUT_OF_MEMORY);
9349 }
9350}
9351
9352GLboolean __stdcall glIsSampler(GLuint sampler)
9353{
9354 EVENT("(GLuint sampler = %u)", sampler);
9355
9356 try
9357 {
9358 gl::Context *context = gl::getNonLostContext();
9359
9360 if (context)
9361 {
9362 if (context->getClientVersion() < 3)
9363 {
9364 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9365 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009366
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009367 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009369 }
9370 catch(std::bad_alloc&)
9371 {
9372 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9373 }
9374
9375 return GL_FALSE;
9376}
9377
9378void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9379{
9380 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9381
9382 try
9383 {
9384 gl::Context *context = gl::getNonLostContext();
9385
9386 if (context)
9387 {
9388 if (context->getClientVersion() < 3)
9389 {
9390 return gl::error(GL_INVALID_OPERATION);
9391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009392
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009393 if (sampler != 0 && !context->isSampler(sampler))
9394 {
9395 return gl::error(GL_INVALID_OPERATION);
9396 }
9397
9398 if (unit >= context->getMaximumCombinedTextureImageUnits())
9399 {
9400 return gl::error(GL_INVALID_VALUE);
9401 }
9402
9403 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009404 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009405 }
9406 catch(std::bad_alloc&)
9407 {
9408 return gl::error(GL_OUT_OF_MEMORY);
9409 }
9410}
9411
9412void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9413{
9414 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9415
9416 try
9417 {
9418 gl::Context *context = gl::getNonLostContext();
9419
9420 if (context)
9421 {
9422 if (context->getClientVersion() < 3)
9423 {
9424 return gl::error(GL_INVALID_OPERATION);
9425 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009426
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009427 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009428 {
9429 return;
9430 }
9431
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009432 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009433 {
9434 return;
9435 }
9436
9437 if (!context->isSampler(sampler))
9438 {
9439 return gl::error(GL_INVALID_OPERATION);
9440 }
9441
9442 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009444 }
9445 catch(std::bad_alloc&)
9446 {
9447 return gl::error(GL_OUT_OF_MEMORY);
9448 }
9449}
9450
9451void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9452{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009453 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009454}
9455
9456void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9457{
9458 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9459
9460 try
9461 {
9462 gl::Context *context = gl::getNonLostContext();
9463
9464 if (context)
9465 {
9466 if (context->getClientVersion() < 3)
9467 {
9468 return gl::error(GL_INVALID_OPERATION);
9469 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009470
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009471 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009472 {
9473 return;
9474 }
9475
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009476 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009477 {
9478 return;
9479 }
9480
9481 if (!context->isSampler(sampler))
9482 {
9483 return gl::error(GL_INVALID_OPERATION);
9484 }
9485
9486 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009487 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009488 }
9489 catch(std::bad_alloc&)
9490 {
9491 return gl::error(GL_OUT_OF_MEMORY);
9492 }
9493}
9494
9495void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9496{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009497 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009498}
9499
9500void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9501{
9502 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9503
9504 try
9505 {
9506 gl::Context *context = gl::getNonLostContext();
9507
9508 if (context)
9509 {
9510 if (context->getClientVersion() < 3)
9511 {
9512 return gl::error(GL_INVALID_OPERATION);
9513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009514
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009515 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009516 {
9517 return;
9518 }
9519
9520 if (!context->isSampler(sampler))
9521 {
9522 return gl::error(GL_INVALID_OPERATION);
9523 }
9524
9525 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009527 }
9528 catch(std::bad_alloc&)
9529 {
9530 return gl::error(GL_OUT_OF_MEMORY);
9531 }
9532}
9533
9534void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9535{
9536 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9537
9538 try
9539 {
9540 gl::Context *context = gl::getNonLostContext();
9541
9542 if (context)
9543 {
9544 if (context->getClientVersion() < 3)
9545 {
9546 return gl::error(GL_INVALID_OPERATION);
9547 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009548
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009549 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009550 {
9551 return;
9552 }
9553
9554 if (!context->isSampler(sampler))
9555 {
9556 return gl::error(GL_INVALID_OPERATION);
9557 }
9558
9559 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009561 }
9562 catch(std::bad_alloc&)
9563 {
9564 return gl::error(GL_OUT_OF_MEMORY);
9565 }
9566}
9567
9568void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9569{
9570 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9571
9572 try
9573 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009574 if (index >= gl::MAX_VERTEX_ATTRIBS)
9575 {
9576 return gl::error(GL_INVALID_VALUE);
9577 }
9578
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009579 gl::Context *context = gl::getNonLostContext();
9580
9581 if (context)
9582 {
9583 if (context->getClientVersion() < 3)
9584 {
9585 return gl::error(GL_INVALID_OPERATION);
9586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009587
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009588 context->setVertexAttribDivisor(index, divisor);
9589 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009590 }
9591 catch(std::bad_alloc&)
9592 {
9593 return gl::error(GL_OUT_OF_MEMORY);
9594 }
9595}
9596
9597void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9598{
9599 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9600
9601 try
9602 {
9603 gl::Context *context = gl::getNonLostContext();
9604
9605 if (context)
9606 {
9607 if (context->getClientVersion() < 3)
9608 {
9609 return gl::error(GL_INVALID_OPERATION);
9610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009611
Geoff Langc8058452014-02-03 12:04:11 -05009612 switch (target)
9613 {
9614 case GL_TRANSFORM_FEEDBACK:
9615 {
9616 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9617 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9618 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9619 {
9620 return gl::error(GL_INVALID_OPERATION);
9621 }
9622
9623 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9624 if (context->getTransformFeedback(id) == NULL)
9625 {
9626 return gl::error(GL_INVALID_OPERATION);
9627 }
9628
9629 context->bindTransformFeedback(id);
9630 }
9631 break;
9632
9633 default:
9634 return gl::error(GL_INVALID_ENUM);
9635 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009636 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009637 }
9638 catch(std::bad_alloc&)
9639 {
9640 return gl::error(GL_OUT_OF_MEMORY);
9641 }
9642}
9643
9644void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9645{
9646 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9647
9648 try
9649 {
9650 gl::Context *context = gl::getNonLostContext();
9651
9652 if (context)
9653 {
9654 if (context->getClientVersion() < 3)
9655 {
9656 return gl::error(GL_INVALID_OPERATION);
9657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009658
Geoff Langc8058452014-02-03 12:04:11 -05009659 for (int i = 0; i < n; i++)
9660 {
9661 context->deleteTransformFeedback(ids[i]);
9662 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009663 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009664 }
9665 catch(std::bad_alloc&)
9666 {
9667 return gl::error(GL_OUT_OF_MEMORY);
9668 }
9669}
9670
9671void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9672{
9673 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9674
9675 try
9676 {
9677 gl::Context *context = gl::getNonLostContext();
9678
9679 if (context)
9680 {
9681 if (context->getClientVersion() < 3)
9682 {
9683 return gl::error(GL_INVALID_OPERATION);
9684 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009685
Geoff Langc8058452014-02-03 12:04:11 -05009686 for (int i = 0; i < n; i++)
9687 {
9688 ids[i] = context->createTransformFeedback();
9689 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009691 }
9692 catch(std::bad_alloc&)
9693 {
9694 return gl::error(GL_OUT_OF_MEMORY);
9695 }
9696}
9697
9698GLboolean __stdcall glIsTransformFeedback(GLuint id)
9699{
9700 EVENT("(GLuint id = %u)", id);
9701
9702 try
9703 {
9704 gl::Context *context = gl::getNonLostContext();
9705
9706 if (context)
9707 {
9708 if (context->getClientVersion() < 3)
9709 {
9710 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009712
Geoff Langc8058452014-02-03 12:04:11 -05009713 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009715 }
9716 catch(std::bad_alloc&)
9717 {
9718 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9719 }
9720
9721 return GL_FALSE;
9722}
9723
9724void __stdcall glPauseTransformFeedback(void)
9725{
9726 EVENT("(void)");
9727
9728 try
9729 {
9730 gl::Context *context = gl::getNonLostContext();
9731
9732 if (context)
9733 {
9734 if (context->getClientVersion() < 3)
9735 {
9736 return gl::error(GL_INVALID_OPERATION);
9737 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009738
Geoff Langc8058452014-02-03 12:04:11 -05009739 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9740 ASSERT(transformFeedback != NULL);
9741
9742 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9743 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9744 {
9745 return gl::error(GL_INVALID_OPERATION);
9746 }
9747
9748 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009749 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009750 }
9751 catch(std::bad_alloc&)
9752 {
9753 return gl::error(GL_OUT_OF_MEMORY);
9754 }
9755}
9756
9757void __stdcall glResumeTransformFeedback(void)
9758{
9759 EVENT("(void)");
9760
9761 try
9762 {
9763 gl::Context *context = gl::getNonLostContext();
9764
9765 if (context)
9766 {
9767 if (context->getClientVersion() < 3)
9768 {
9769 return gl::error(GL_INVALID_OPERATION);
9770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009771
Geoff Langc8058452014-02-03 12:04:11 -05009772 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9773 ASSERT(transformFeedback != NULL);
9774
9775 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9776 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9777 {
9778 return gl::error(GL_INVALID_OPERATION);
9779 }
9780
9781 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009783 }
9784 catch(std::bad_alloc&)
9785 {
9786 return gl::error(GL_OUT_OF_MEMORY);
9787 }
9788}
9789
9790void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9791{
9792 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9793 program, bufSize, length, binaryFormat, binary);
9794
9795 try
9796 {
9797 gl::Context *context = gl::getNonLostContext();
9798
9799 if (context)
9800 {
9801 if (context->getClientVersion() < 3)
9802 {
9803 return gl::error(GL_INVALID_OPERATION);
9804 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009805
Jamie Madill54133512013-06-21 09:33:07 -04009806 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009807 UNIMPLEMENTED();
9808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009809 }
9810 catch(std::bad_alloc&)
9811 {
9812 return gl::error(GL_OUT_OF_MEMORY);
9813 }
9814}
9815
9816void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9817{
9818 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9819 program, binaryFormat, binary, length);
9820
9821 try
9822 {
9823 gl::Context *context = gl::getNonLostContext();
9824
9825 if (context)
9826 {
9827 if (context->getClientVersion() < 3)
9828 {
9829 return gl::error(GL_INVALID_OPERATION);
9830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009831
Jamie Madill54133512013-06-21 09:33:07 -04009832 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009833 UNIMPLEMENTED();
9834 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009835 }
9836 catch(std::bad_alloc&)
9837 {
9838 return gl::error(GL_OUT_OF_MEMORY);
9839 }
9840}
9841
9842void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9843{
9844 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9845 program, pname, value);
9846
9847 try
9848 {
9849 gl::Context *context = gl::getNonLostContext();
9850
9851 if (context)
9852 {
9853 if (context->getClientVersion() < 3)
9854 {
9855 return gl::error(GL_INVALID_OPERATION);
9856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009857
Jamie Madill54133512013-06-21 09:33:07 -04009858 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009859 UNIMPLEMENTED();
9860 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009861 }
9862 catch(std::bad_alloc&)
9863 {
9864 return gl::error(GL_OUT_OF_MEMORY);
9865 }
9866}
9867
9868void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9869{
9870 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9871 target, numAttachments, attachments);
9872
9873 try
9874 {
9875 gl::Context *context = gl::getNonLostContext();
9876
9877 if (context)
9878 {
9879 if (context->getClientVersion() < 3)
9880 {
9881 return gl::error(GL_INVALID_OPERATION);
9882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009883
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009884 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009885 {
9886 return;
9887 }
9888
9889 int maxDimension = context->getMaximumRenderbufferDimension();
9890 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009892 }
9893 catch(std::bad_alloc&)
9894 {
9895 return gl::error(GL_OUT_OF_MEMORY);
9896 }
9897}
9898
9899void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9900{
9901 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9902 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9903 target, numAttachments, attachments, x, y, width, height);
9904
9905 try
9906 {
9907 gl::Context *context = gl::getNonLostContext();
9908
9909 if (context)
9910 {
9911 if (context->getClientVersion() < 3)
9912 {
9913 return gl::error(GL_INVALID_OPERATION);
9914 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009915
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009916 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009917 {
9918 return;
9919 }
9920
9921 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009923 }
9924 catch(std::bad_alloc&)
9925 {
9926 return gl::error(GL_OUT_OF_MEMORY);
9927 }
9928}
9929
9930void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9931{
9932 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9933 target, levels, internalformat, width, height);
9934
9935 try
9936 {
9937 gl::Context *context = gl::getNonLostContext();
9938
9939 if (context)
9940 {
9941 if (context->getClientVersion() < 3)
9942 {
9943 return gl::error(GL_INVALID_OPERATION);
9944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009945
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009946 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009947 {
9948 return;
9949 }
9950
9951 switch (target)
9952 {
9953 case GL_TEXTURE_2D:
9954 {
9955 gl::Texture2D *texture2d = context->getTexture2D();
9956 texture2d->storage(levels, internalformat, width, height);
9957 }
9958 break;
9959
Geoff Lang01c21d22013-09-24 11:52:16 -04009960 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009961 {
9962 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9963 textureCube->storage(levels, internalformat, width);
9964 }
9965 break;
9966
9967 default:
9968 return gl::error(GL_INVALID_ENUM);
9969 }
9970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009971 }
9972 catch(std::bad_alloc&)
9973 {
9974 return gl::error(GL_OUT_OF_MEMORY);
9975 }
9976}
9977
9978void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9979{
9980 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9981 "GLsizei height = %d, GLsizei depth = %d)",
9982 target, levels, internalformat, width, height, depth);
9983
9984 try
9985 {
9986 gl::Context *context = gl::getNonLostContext();
9987
9988 if (context)
9989 {
9990 if (context->getClientVersion() < 3)
9991 {
9992 return gl::error(GL_INVALID_OPERATION);
9993 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009994
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009995 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009996 {
9997 return;
9998 }
9999
10000 switch (target)
10001 {
10002 case GL_TEXTURE_3D:
10003 {
10004 gl::Texture3D *texture3d = context->getTexture3D();
10005 texture3d->storage(levels, internalformat, width, height, depth);
10006 }
10007 break;
10008
10009 case GL_TEXTURE_2D_ARRAY:
10010 {
10011 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10012 texture2darray->storage(levels, internalformat, width, height, depth);
10013 }
10014 break;
10015
10016 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010017 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010018 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010020 }
10021 catch(std::bad_alloc&)
10022 {
10023 return gl::error(GL_OUT_OF_MEMORY);
10024 }
10025}
10026
10027void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10028{
10029 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10030 "GLint* params = 0x%0.8p)",
10031 target, internalformat, pname, bufSize, params);
10032
10033 try
10034 {
10035 gl::Context *context = gl::getNonLostContext();
10036
10037 if (context)
10038 {
10039 if (context->getClientVersion() < 3)
10040 {
10041 return gl::error(GL_INVALID_OPERATION);
10042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010043
Shannon Woods809d2502013-07-08 10:32:18 -040010044 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10045 !gl::IsDepthRenderingSupported(internalformat, context) &&
10046 !gl::IsStencilRenderingSupported(internalformat, context))
10047 {
10048 return gl::error(GL_INVALID_ENUM);
10049 }
10050
10051 if (target != GL_RENDERBUFFER)
10052 {
10053 return gl::error(GL_INVALID_ENUM);
10054 }
10055
10056 if (bufSize < 0)
10057 {
10058 return gl::error(GL_INVALID_VALUE);
10059 }
10060
10061 switch (pname)
10062 {
10063 case GL_NUM_SAMPLE_COUNTS:
10064 if (bufSize != 0)
10065 *params = context->getNumSampleCounts(internalformat);
10066 break;
10067 case GL_SAMPLES:
10068 context->getSampleCounts(internalformat, bufSize, params);
10069 break;
10070 default:
10071 return gl::error(GL_INVALID_ENUM);
10072 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010073 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010074 }
10075 catch(std::bad_alloc&)
10076 {
10077 return gl::error(GL_OUT_OF_MEMORY);
10078 }
10079}
10080
10081// Extension functions
10082
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010083void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10084 GLbitfield mask, GLenum filter)
10085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010086 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010087 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10088 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10089 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10090
10091 try
10092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010094
10095 if (context)
10096 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010097 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010098 dstX0, dstY0, dstX1, dstY1, mask, filter,
10099 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010100 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010101 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010102 }
10103
Geoff Lang758d5b22013-06-11 11:42:50 -040010104 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10105 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010106 }
10107 }
10108 catch(std::bad_alloc&)
10109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010111 }
10112}
10113
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010114void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10115 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010117 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010118 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010119 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010120 target, level, internalformat, width, height, depth, border, format, type, pixels);
10121
10122 try
10123 {
10124 UNIMPLEMENTED(); // FIXME
10125 }
10126 catch(std::bad_alloc&)
10127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010128 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010129 }
10130}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010131
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010132void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10133 GLenum *binaryFormat, void *binary)
10134{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010135 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 +000010136 program, bufSize, length, binaryFormat, binary);
10137
10138 try
10139 {
10140 gl::Context *context = gl::getNonLostContext();
10141
10142 if (context)
10143 {
10144 gl::Program *programObject = context->getProgram(program);
10145
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010146 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010148 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010149 }
10150
10151 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10152
10153 if (!programBinary)
10154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010155 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010156 }
10157
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010158 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010160 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010161 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010162
10163 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010164 }
10165 }
10166 catch(std::bad_alloc&)
10167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010168 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010169 }
10170}
10171
10172void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10173 const void *binary, GLint length)
10174{
10175 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10176 program, binaryFormat, binary, length);
10177
10178 try
10179 {
10180 gl::Context *context = gl::getNonLostContext();
10181
10182 if (context)
10183 {
10184 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010186 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010187 }
10188
10189 gl::Program *programObject = context->getProgram(program);
10190
10191 if (!programObject)
10192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010193 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010194 }
10195
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010196 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010197 }
10198 }
10199 catch(std::bad_alloc&)
10200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010201 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010202 }
10203}
10204
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010205void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10206{
10207 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10208
10209 try
10210 {
10211 gl::Context *context = gl::getNonLostContext();
10212
10213 if (context)
10214 {
10215 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10216 {
10217 return gl::error(GL_INVALID_VALUE);
10218 }
10219
10220 if (context->getDrawFramebufferHandle() == 0)
10221 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010222 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010223 {
10224 return gl::error(GL_INVALID_OPERATION);
10225 }
10226
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010227 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010228 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010229 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010230 }
10231 }
10232 else
10233 {
10234 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10235 {
10236 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10237 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10238 {
10239 return gl::error(GL_INVALID_OPERATION);
10240 }
10241 }
10242 }
10243
10244 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10245
10246 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10247 {
10248 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10249 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010250
10251 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10252 {
10253 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10254 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010255 }
10256 }
10257 catch (std::bad_alloc&)
10258 {
10259 return gl::error(GL_OUT_OF_MEMORY);
10260 }
10261}
10262
Shannon Woodsb3801742014-03-27 14:59:19 -040010263void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
10264{
10265 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
10266
10267 try
10268 {
10269 gl::Context *context = gl::getNonLostContext();
10270
10271 if (context)
10272 {
10273 if (!context->supportsPBOs())
10274 {
10275 return gl::error(GL_INVALID_OPERATION);
10276 }
10277
10278 if (!gl::ValidBufferTarget(context, target))
10279 {
10280 return gl::error(GL_INVALID_ENUM);
10281 }
10282
10283 if (pname != GL_BUFFER_MAP_POINTER)
10284 {
10285 return gl::error(GL_INVALID_ENUM);
10286 }
10287
10288 gl::Buffer *buffer = context->getTargetBuffer(target);
10289
10290 if (!buffer || !buffer->mapped())
10291 {
10292 *params = NULL;
10293 }
10294
10295 *params = buffer->mapPointer();
10296 }
10297 }
10298 catch (std::bad_alloc&)
10299 {
10300 return gl::error(GL_OUT_OF_MEMORY);
10301 }
10302}
10303
10304void * __stdcall glMapBufferOES(GLenum target, GLenum access)
10305{
10306 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
10307
10308 try
10309 {
10310 gl::Context *context = gl::getNonLostContext();
10311
10312 if (context)
10313 {
10314 if (!gl::ValidBufferTarget(context, target))
10315 {
10316 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10317 }
10318
10319 gl::Buffer *buffer = context->getTargetBuffer(target);
10320
10321 if (buffer == NULL)
10322 {
10323 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10324 }
10325
10326 if (access != GL_WRITE_ONLY_OES)
10327 {
10328 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10329 }
10330
10331 if (buffer->mapped())
10332 {
10333 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10334 }
10335
10336 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10337 }
10338 }
10339 catch(std::bad_alloc&)
10340 {
10341 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10342 }
10343
10344 return NULL;
10345}
10346
10347GLboolean __stdcall glUnmapBufferOES(GLenum target)
10348{
10349 EVENT("(GLenum target = 0x%X)", target);
10350
10351 try
10352 {
10353 gl::Context *context = gl::getNonLostContext();
10354
10355 if (context)
10356 {
10357 if (!gl::ValidBufferTarget(context, target))
10358 {
10359 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10360 }
10361
10362 gl::Buffer *buffer = context->getTargetBuffer(target);
10363
10364 if (buffer == NULL || !buffer->mapped())
10365 {
10366 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10367 }
10368
10369 // TODO: detect if we had corruption. if so, throw an error and return false.
10370
10371 buffer->unmap();
10372
10373 return GL_TRUE;
10374 }
10375 }
10376 catch(std::bad_alloc&)
10377 {
10378 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10379 }
10380
10381 return GL_FALSE;
10382}
10383
Shannon Woods916e7692014-03-27 16:58:22 -040010384void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10385{
10386 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10387 target, offset, length, access);
10388
10389 try
10390 {
10391 gl::Context *context = gl::getNonLostContext();
10392
10393 if (context)
10394 {
10395 if (!gl::ValidBufferTarget(context, target))
10396 {
10397 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10398 }
10399
10400 if (offset < 0 || length < 0)
10401 {
10402 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10403 }
10404
10405 gl::Buffer *buffer = context->getTargetBuffer(target);
10406
10407 if (buffer == NULL)
10408 {
10409 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10410 }
10411
10412 // Check for buffer overflow
10413 size_t offsetSize = static_cast<size_t>(offset);
10414 size_t lengthSize = static_cast<size_t>(length);
10415
10416 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10417 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10418 {
10419 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10420 }
10421
10422 // Check for invalid bits in the mask
10423 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10424 GL_MAP_WRITE_BIT |
10425 GL_MAP_INVALIDATE_RANGE_BIT |
10426 GL_MAP_INVALIDATE_BUFFER_BIT |
10427 GL_MAP_FLUSH_EXPLICIT_BIT |
10428 GL_MAP_UNSYNCHRONIZED_BIT;
10429
10430 if (access & ~(allAccessBits))
10431 {
10432 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10433 }
10434
10435 if (length == 0 || buffer->mapped())
10436 {
10437 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10438 }
10439
10440 // Check for invalid bit combinations
10441 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10442 {
10443 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10444 }
10445
10446 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10447 GL_MAP_INVALIDATE_BUFFER_BIT |
10448 GL_MAP_UNSYNCHRONIZED_BIT;
10449
10450 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10451 {
10452 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10453 }
10454
10455 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10456 {
10457 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10458 }
10459
10460 return buffer->mapRange(offset, length, access);
10461 }
10462 }
10463 catch(std::bad_alloc&)
10464 {
10465 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10466 }
10467
10468 return NULL;
10469}
10470
10471void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10472{
10473 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10474
10475 try
10476 {
10477 gl::Context *context = gl::getNonLostContext();
10478
10479 if (context)
10480 {
10481 if (offset < 0 || length < 0)
10482 {
10483 return gl::error(GL_INVALID_VALUE);
10484 }
10485
10486 if (!gl::ValidBufferTarget(context, target))
10487 {
10488 return gl::error(GL_INVALID_ENUM);
10489 }
10490
10491 gl::Buffer *buffer = context->getTargetBuffer(target);
10492
10493 if (buffer == NULL)
10494 {
10495 return gl::error(GL_INVALID_OPERATION);
10496 }
10497
10498 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10499 {
10500 return gl::error(GL_INVALID_OPERATION);
10501 }
10502
10503 // Check for buffer overflow
10504 size_t offsetSize = static_cast<size_t>(offset);
10505 size_t lengthSize = static_cast<size_t>(length);
10506
10507 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10508 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10509 {
10510 return gl::error(GL_INVALID_VALUE);
10511 }
10512
10513 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10514 }
10515 }
10516 catch(std::bad_alloc&)
10517 {
10518 return gl::error(GL_OUT_OF_MEMORY);
10519 }
10520}
10521
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010522__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10523{
10524 struct Extension
10525 {
10526 const char *name;
10527 __eglMustCastToProperFunctionPointerType address;
10528 };
10529
10530 static const Extension glExtensions[] =
10531 {
10532 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010533 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010534 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010535 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10536 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10537 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10538 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10539 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10540 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10541 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010542 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010543 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010544 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10545 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10546 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10547 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010548 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10549 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10550 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10551 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10552 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10553 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10554 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010555 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010556 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10557 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10558 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010559 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010560 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10561 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10562 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010563 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10564 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10565 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010566
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010567 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010568 {
10569 if (strcmp(procname, glExtensions[ext].name) == 0)
10570 {
10571 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10572 }
10573 }
10574
10575 return NULL;
10576}
10577
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010578// Non-public functions used by EGL
10579
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010580bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010581{
10582 EVENT("(egl::Surface* surface = 0x%0.8p)",
10583 surface);
10584
10585 try
10586 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010587 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010588
10589 if (context)
10590 {
10591 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010592 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010593
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010594 if (textureObject->isImmutable())
10595 {
10596 return false;
10597 }
10598
Geoff Lang32d508e2014-02-11 09:39:48 -050010599 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010600 }
10601 }
10602 catch(std::bad_alloc&)
10603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010604 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010605 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010606
10607 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010608}
10609
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010610}