blob: 069e5717f7b061ac2b04312153fbf14924899724 [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,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005169 0, 0, 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 Madillefb2a6f2013-09-24 10:22:42 -04005176 0, 0, 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
5181 switch (target)
5182 {
5183 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005184 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005185 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005186 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005187 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005188 break;
5189
5190 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5191 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5192 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5193 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5194 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5195 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005196 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005197 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005198 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005199 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005200 break;
5201
5202 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005203 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005204 }
5205 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206 }
5207 catch(std::bad_alloc&)
5208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 }
5211}
5212
5213void __stdcall glUniform1f(GLint location, GLfloat x)
5214{
5215 glUniform1fv(location, 1, &x);
5216}
5217
5218void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5219{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005220 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005221
5222 try
5223 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224 if (count < 0)
5225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005226 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 }
5228
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005229 if (location == -1)
5230 {
5231 return;
5232 }
5233
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005234 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235
5236 if (context)
5237 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005238 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005239 if (!programBinary)
5240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005241 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005242 }
5243
5244 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005246 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005247 }
5248 }
5249 }
5250 catch(std::bad_alloc&)
5251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005252 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 }
5254}
5255
5256void __stdcall glUniform1i(GLint location, GLint x)
5257{
5258 glUniform1iv(location, 1, &x);
5259}
5260
5261void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005263 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005264
5265 try
5266 {
5267 if (count < 0)
5268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005269 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270 }
5271
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005272 if (location == -1)
5273 {
5274 return;
5275 }
5276
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005278
5279 if (context)
5280 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005281 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005282 if (!programBinary)
5283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005284 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005285 }
5286
5287 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290 }
5291 }
5292 }
5293 catch(std::bad_alloc&)
5294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005295 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 }
5297}
5298
5299void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5300{
5301 GLfloat xy[2] = {x, y};
5302
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005303 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304}
5305
5306void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005308 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005309
5310 try
5311 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005312 if (count < 0)
5313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005316
5317 if (location == -1)
5318 {
5319 return;
5320 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323
5324 if (context)
5325 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005326 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005327 if (!programBinary)
5328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005329 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005330 }
5331
5332 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005334 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336 }
5337 }
5338 catch(std::bad_alloc&)
5339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341 }
5342}
5343
5344void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5345{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005346 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005348 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005349}
5350
5351void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005353 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354
5355 try
5356 {
5357 if (count < 0)
5358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 }
5361
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005362 if (location == -1)
5363 {
5364 return;
5365 }
5366
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005368
5369 if (context)
5370 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005371 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005372 if (!programBinary)
5373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005374 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005375 }
5376
5377 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005380 }
5381 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005382 }
5383 catch(std::bad_alloc&)
5384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005385 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005386 }
5387}
5388
5389void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5390{
5391 GLfloat xyz[3] = {x, y, z};
5392
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005393 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394}
5395
5396void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5397{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005398 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005399
5400 try
5401 {
5402 if (count < 0)
5403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005404 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405 }
5406
5407 if (location == -1)
5408 {
5409 return;
5410 }
5411
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413
5414 if (context)
5415 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005416 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005417 if (!programBinary)
5418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005419 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005420 }
5421
5422 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426 }
5427 }
5428 catch(std::bad_alloc&)
5429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431 }
5432}
5433
5434void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5435{
5436 GLint xyz[3] = {x, y, z};
5437
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005438 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439}
5440
5441void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005443 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444
5445 try
5446 {
5447 if (count < 0)
5448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005449 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005450 }
5451
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005452 if (location == -1)
5453 {
5454 return;
5455 }
5456
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005457 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005458
5459 if (context)
5460 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005461 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005462 if (!programBinary)
5463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005465 }
5466
5467 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005470 }
5471 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005472 }
5473 catch(std::bad_alloc&)
5474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005475 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476 }
5477}
5478
5479void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5480{
5481 GLfloat xyzw[4] = {x, y, z, w};
5482
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005483 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484}
5485
5486void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005488 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005489
5490 try
5491 {
5492 if (count < 0)
5493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005494 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495 }
5496
5497 if (location == -1)
5498 {
5499 return;
5500 }
5501
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503
5504 if (context)
5505 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005506 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005507 if (!programBinary)
5508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005509 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005510 }
5511
5512 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
5516 }
5517 }
5518 catch(std::bad_alloc&)
5519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005521 }
5522}
5523
5524void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5525{
5526 GLint xyzw[4] = {x, y, z, w};
5527
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005528 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529}
5530
5531void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005533 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534
5535 try
5536 {
5537 if (count < 0)
5538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005539 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540 }
5541
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005542 if (location == -1)
5543 {
5544 return;
5545 }
5546
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005547 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005548
5549 if (context)
5550 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005551 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005552 if (!programBinary)
5553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005554 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005555 }
5556
5557 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005560 }
5561 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005562 }
5563 catch(std::bad_alloc&)
5564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005566 }
5567}
5568
5569void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5570{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005571 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005572 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573
5574 try
5575 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005576 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005579 }
5580
5581 if (location == -1)
5582 {
5583 return;
5584 }
5585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005587
5588 if (context)
5589 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005590 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5591 {
5592 return gl::error(GL_INVALID_VALUE);
5593 }
5594
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005595 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005596 if (!programBinary)
5597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005598 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005599 }
5600
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005601 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005603 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604 }
5605 }
5606 }
5607 catch(std::bad_alloc&)
5608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005610 }
5611}
5612
5613void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5614{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005615 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005616 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617
5618 try
5619 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005620 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624
5625 if (location == -1)
5626 {
5627 return;
5628 }
5629
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631
5632 if (context)
5633 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005634 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5635 {
5636 return gl::error(GL_INVALID_VALUE);
5637 }
5638
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005639 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005640 if (!programBinary)
5641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005642 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005643 }
5644
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005645 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005647 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005648 }
5649 }
5650 }
5651 catch(std::bad_alloc&)
5652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005654 }
5655}
5656
5657void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5658{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005659 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005660 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 try
5663 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005664 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667 }
5668
5669 if (location == -1)
5670 {
5671 return;
5672 }
5673
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005675
5676 if (context)
5677 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005678 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5679 {
5680 return gl::error(GL_INVALID_VALUE);
5681 }
5682
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005683 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005684 if (!programBinary)
5685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005686 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005687 }
5688
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005689 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005691 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692 }
5693 }
5694 }
5695 catch(std::bad_alloc&)
5696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005697 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005698 }
5699}
5700
5701void __stdcall glUseProgram(GLuint program)
5702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005703 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005704
5705 try
5706 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708
5709 if (context)
5710 {
5711 gl::Program *programObject = context->getProgram(program);
5712
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005713 if (!programObject && program != 0)
5714 {
5715 if (context->getShader(program))
5716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005718 }
5719 else
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005722 }
5723 }
5724
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005725 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005727 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729
5730 context->useProgram(program);
5731 }
5732 }
5733 catch(std::bad_alloc&)
5734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005735 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 }
5737}
5738
5739void __stdcall glValidateProgram(GLuint program)
5740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005741 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005742
5743 try
5744 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005745 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005746
5747 if (context)
5748 {
5749 gl::Program *programObject = context->getProgram(program);
5750
5751 if (!programObject)
5752 {
5753 if (context->getShader(program))
5754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005755 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005756 }
5757 else
5758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005759 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005760 }
5761 }
5762
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005763 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005764 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005765 }
5766 catch(std::bad_alloc&)
5767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005768 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005769 }
5770}
5771
5772void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005774 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005775
5776 try
5777 {
5778 if (index >= gl::MAX_VERTEX_ATTRIBS)
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781 }
5782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005784
5785 if (context)
5786 {
5787 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005788 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005789 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790 }
5791 catch(std::bad_alloc&)
5792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005793 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794 }
5795}
5796
5797void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005799 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800
5801 try
5802 {
5803 if (index >= gl::MAX_VERTEX_ATTRIBS)
5804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806 }
5807
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005809
5810 if (context)
5811 {
5812 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005813 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005814 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005815 }
5816 catch(std::bad_alloc&)
5817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 }
5820}
5821
5822void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005824 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825
5826 try
5827 {
5828 if (index >= gl::MAX_VERTEX_ATTRIBS)
5829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005830 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831 }
5832
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005833 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005834
5835 if (context)
5836 {
5837 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005838 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005839 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841 catch(std::bad_alloc&)
5842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005843 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005844 }
5845}
5846
5847void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005849 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005850
5851 try
5852 {
5853 if (index >= gl::MAX_VERTEX_ATTRIBS)
5854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005855 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 }
5857
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005858 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005859
5860 if (context)
5861 {
5862 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005863 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005864 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005865 }
5866 catch(std::bad_alloc&)
5867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005869 }
5870}
5871
5872void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005874 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 +00005875
5876 try
5877 {
5878 if (index >= gl::MAX_VERTEX_ATTRIBS)
5879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005884
5885 if (context)
5886 {
5887 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005888 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005889 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005890 }
5891 catch(std::bad_alloc&)
5892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005893 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005894 }
5895}
5896
5897void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005899 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900
5901 try
5902 {
5903 if (index >= gl::MAX_VERTEX_ATTRIBS)
5904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005905 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005908 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005909
5910 if (context)
5911 {
5912 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005913 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005914 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005915 }
5916 catch(std::bad_alloc&)
5917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005919 }
5920}
5921
5922void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5923{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005924 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 +00005925
5926 try
5927 {
5928 if (index >= gl::MAX_VERTEX_ATTRIBS)
5929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931 }
5932
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005934
5935 if (context)
5936 {
5937 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005938 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005940 }
5941 catch(std::bad_alloc&)
5942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944 }
5945}
5946
5947void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005949 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950
5951 try
5952 {
5953 if (index >= gl::MAX_VERTEX_ATTRIBS)
5954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005955 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956 }
5957
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005958 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005959
5960 if (context)
5961 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005962 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005963 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965 catch(std::bad_alloc&)
5966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005967 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 }
5969}
5970
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005971void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5972{
5973 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5974
5975 try
5976 {
5977 if (index >= gl::MAX_VERTEX_ATTRIBS)
5978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005980 }
5981
5982 gl::Context *context = gl::getNonLostContext();
5983
5984 if (context)
5985 {
5986 context->setVertexAttribDivisor(index, divisor);
5987 }
5988 }
5989 catch(std::bad_alloc&)
5990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005992 }
5993}
5994
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005995void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005997 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005998 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005999 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006000
6001 try
6002 {
6003 if (index >= gl::MAX_VERTEX_ATTRIBS)
6004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006005 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006006 }
6007
6008 if (size < 1 || size > 4)
6009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 }
6012
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006013 gl::Context *context = gl::getNonLostContext();
6014
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006015 switch (type)
6016 {
6017 case GL_BYTE:
6018 case GL_UNSIGNED_BYTE:
6019 case GL_SHORT:
6020 case GL_UNSIGNED_SHORT:
6021 case GL_FIXED:
6022 case GL_FLOAT:
6023 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006024 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006025 case GL_INT:
6026 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006027 case GL_INT_2_10_10_10_REV:
6028 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006029 if (context && context->getClientVersion() < 3)
6030 {
6031 return gl::error(GL_INVALID_ENUM);
6032 }
6033 else
6034 {
6035 break;
6036 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006038 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039 }
6040
6041 if (stride < 0)
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 }
6045
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006046 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6047 {
6048 return gl::error(GL_INVALID_OPERATION);
6049 }
6050
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 if (context)
6052 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006053 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6054 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6055 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6056 // and the pointer argument is not NULL.
6057 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6058 {
6059 return gl::error(GL_INVALID_OPERATION);
6060 }
6061
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006062 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6063 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065 }
6066 catch(std::bad_alloc&)
6067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006068 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006069 }
6070}
6071
6072void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6073{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006074 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 +00006075
6076 try
6077 {
6078 if (width < 0 || height < 0)
6079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006080 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006081 }
6082
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006084
6085 if (context)
6086 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006087 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006088 }
6089 }
6090 catch(std::bad_alloc&)
6091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093 }
6094}
6095
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006096// OpenGL ES 3.0 functions
6097
6098void __stdcall glReadBuffer(GLenum mode)
6099{
6100 EVENT("(GLenum mode = 0x%X)", mode);
6101
6102 try
6103 {
6104 gl::Context *context = gl::getNonLostContext();
6105
6106 if (context)
6107 {
6108 if (context->getClientVersion() < 3)
6109 {
6110 return gl::error(GL_INVALID_OPERATION);
6111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006112
Jamie Madill54133512013-06-21 09:33:07 -04006113 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006114 UNIMPLEMENTED();
6115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006116 }
6117 catch(std::bad_alloc&)
6118 {
6119 return gl::error(GL_OUT_OF_MEMORY);
6120 }
6121}
6122
6123void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6124{
6125 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6126 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6127
6128 try
6129 {
6130 gl::Context *context = gl::getNonLostContext();
6131
6132 if (context)
6133 {
6134 if (context->getClientVersion() < 3)
6135 {
6136 return gl::error(GL_INVALID_OPERATION);
6137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006138
Jamie Madill54133512013-06-21 09:33:07 -04006139 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006140 UNIMPLEMENTED();
6141 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006142 }
6143 catch(std::bad_alloc&)
6144 {
6145 return gl::error(GL_OUT_OF_MEMORY);
6146 }
6147}
6148
6149void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6150{
6151 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6152 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6153 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6154 target, level, internalformat, width, height, depth, border, format, type, pixels);
6155
6156 try
6157 {
6158 gl::Context *context = gl::getNonLostContext();
6159
6160 if (context)
6161 {
6162 if (context->getClientVersion() < 3)
6163 {
6164 return gl::error(GL_INVALID_OPERATION);
6165 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006166
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006167 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006168 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006169 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006170 {
6171 return;
6172 }
6173
6174 switch(target)
6175 {
6176 case GL_TEXTURE_3D:
6177 {
6178 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006179 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006180 }
6181 break;
6182
6183 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006184 {
6185 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006186 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006187 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006188 break;
6189
6190 default:
6191 return gl::error(GL_INVALID_ENUM);
6192 }
6193 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006194 }
6195 catch(std::bad_alloc&)
6196 {
6197 return gl::error(GL_OUT_OF_MEMORY);
6198 }
6199}
6200
6201void __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)
6202{
6203 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6204 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6205 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6206 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6207
6208 try
6209 {
6210 gl::Context *context = gl::getNonLostContext();
6211
6212 if (context)
6213 {
6214 if (context->getClientVersion() < 3)
6215 {
6216 return gl::error(GL_INVALID_OPERATION);
6217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006218
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006219 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006220 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006221 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006222 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006223 {
6224 return;
6225 }
6226
6227 switch(target)
6228 {
6229 case GL_TEXTURE_3D:
6230 {
6231 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006232 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 +00006233 }
6234 break;
6235
6236 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006237 {
6238 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006239 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 +00006240 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006241 break;
6242
6243 default:
6244 return gl::error(GL_INVALID_ENUM);
6245 }
6246 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006247 }
6248 catch(std::bad_alloc&)
6249 {
6250 return gl::error(GL_OUT_OF_MEMORY);
6251 }
6252}
6253
6254void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6255{
6256 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6257 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6258 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6259
6260 try
6261 {
6262 gl::Context *context = gl::getNonLostContext();
6263
6264 if (context)
6265 {
6266 if (context->getClientVersion() < 3)
6267 {
6268 return gl::error(GL_INVALID_OPERATION);
6269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006270
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006271 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006272 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006273 {
6274 return;
6275 }
6276
6277 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6278 gl::Texture *texture = NULL;
6279 switch (target)
6280 {
6281 case GL_TEXTURE_3D:
6282 texture = context->getTexture3D();
6283 break;
6284
6285 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006286 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006287 break;
6288
6289 default:
6290 return gl::error(GL_INVALID_ENUM);
6291 }
6292
6293 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6294 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006295 }
6296 catch(std::bad_alloc&)
6297 {
6298 return gl::error(GL_OUT_OF_MEMORY);
6299 }
6300}
6301
6302void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6303{
Geoff Langeef52cc2013-10-16 15:07:39 -04006304 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 +00006305 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6306 "const GLvoid* data = 0x%0.8p)",
6307 target, level, internalformat, width, height, depth, border, imageSize, data);
6308
6309 try
6310 {
6311 gl::Context *context = gl::getNonLostContext();
6312
6313 if (context)
6314 {
6315 if (context->getClientVersion() < 3)
6316 {
6317 return gl::error(GL_INVALID_OPERATION);
6318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006319
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006320 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 +00006321 {
6322 return gl::error(GL_INVALID_VALUE);
6323 }
6324
6325 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006326 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006327 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006328 {
6329 return;
6330 }
6331
6332 switch(target)
6333 {
6334 case GL_TEXTURE_3D:
6335 {
6336 gl::Texture3D *texture = context->getTexture3D();
6337 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6338 }
6339 break;
6340
6341 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006342 {
6343 gl::Texture2DArray *texture = context->getTexture2DArray();
6344 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6345 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006346 break;
6347
6348 default:
6349 return gl::error(GL_INVALID_ENUM);
6350 }
6351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006352 }
6353 catch(std::bad_alloc&)
6354 {
6355 return gl::error(GL_OUT_OF_MEMORY);
6356 }
6357}
6358
6359void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
6360{
6361 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6362 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6363 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6364 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6365
6366 try
6367 {
6368 gl::Context *context = gl::getNonLostContext();
6369
6370 if (context)
6371 {
6372 if (context->getClientVersion() < 3)
6373 {
6374 return gl::error(GL_INVALID_OPERATION);
6375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006376
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006377 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 +00006378 {
6379 return gl::error(GL_INVALID_VALUE);
6380 }
6381
6382 if (!data)
6383 {
6384 return gl::error(GL_INVALID_VALUE);
6385 }
6386
6387 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006388 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006389 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006390 {
6391 return;
6392 }
6393
6394 switch(target)
6395 {
6396 case GL_TEXTURE_3D:
6397 {
6398 gl::Texture3D *texture = context->getTexture3D();
6399 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6400 format, imageSize, data);
6401 }
6402 break;
6403
6404 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006405 {
6406 gl::Texture2DArray *texture = context->getTexture2DArray();
6407 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6408 format, imageSize, data);
6409 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006410 break;
6411
6412 default:
6413 return gl::error(GL_INVALID_ENUM);
6414 }
6415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006416 }
6417 catch(std::bad_alloc&)
6418 {
6419 return gl::error(GL_OUT_OF_MEMORY);
6420 }
6421}
6422
6423void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6424{
6425 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6426
6427 try
6428 {
6429 gl::Context *context = gl::getNonLostContext();
6430
6431 if (context)
6432 {
6433 if (context->getClientVersion() < 3)
6434 {
6435 return gl::error(GL_INVALID_OPERATION);
6436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006437
Geoff Lang37dde692014-01-31 16:34:54 -05006438 if (n < 0)
6439 {
6440 return gl::error(GL_INVALID_VALUE);
6441 }
6442
6443 for (GLsizei i = 0; i < n; i++)
6444 {
6445 ids[i] = context->createQuery();
6446 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006448 }
6449 catch(std::bad_alloc&)
6450 {
6451 return gl::error(GL_OUT_OF_MEMORY);
6452 }
6453}
6454
6455void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6456{
6457 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6458
6459 try
6460 {
6461 gl::Context *context = gl::getNonLostContext();
6462
6463 if (context)
6464 {
6465 if (context->getClientVersion() < 3)
6466 {
6467 return gl::error(GL_INVALID_OPERATION);
6468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006469
Geoff Lang37dde692014-01-31 16:34:54 -05006470 if (n < 0)
6471 {
6472 return gl::error(GL_INVALID_VALUE);
6473 }
6474
6475 for (GLsizei i = 0; i < n; i++)
6476 {
6477 context->deleteQuery(ids[i]);
6478 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480 }
6481 catch(std::bad_alloc&)
6482 {
6483 return gl::error(GL_OUT_OF_MEMORY);
6484 }
6485}
6486
6487GLboolean __stdcall glIsQuery(GLuint id)
6488{
6489 EVENT("(GLuint id = %u)", id);
6490
6491 try
6492 {
6493 gl::Context *context = gl::getNonLostContext();
6494
6495 if (context)
6496 {
6497 if (context->getClientVersion() < 3)
6498 {
6499 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006501
Geoff Lang37dde692014-01-31 16:34:54 -05006502 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
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, GL_FALSE);
6508 }
6509
6510 return GL_FALSE;
6511}
6512
6513void __stdcall glBeginQuery(GLenum target, GLuint id)
6514{
6515 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6516
6517 try
6518 {
6519 gl::Context *context = gl::getNonLostContext();
6520
6521 if (context)
6522 {
6523 if (context->getClientVersion() < 3)
6524 {
6525 return gl::error(GL_INVALID_OPERATION);
6526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006527
Geoff Lang37dde692014-01-31 16:34:54 -05006528 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006529 {
Geoff Lang37dde692014-01-31 16:34:54 -05006530 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006531 }
6532
6533 if (id == 0)
6534 {
6535 return gl::error(GL_INVALID_OPERATION);
6536 }
6537
Geoff Lang37dde692014-01-31 16:34:54 -05006538 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006540 }
6541 catch(std::bad_alloc&)
6542 {
6543 return gl::error(GL_OUT_OF_MEMORY);
6544 }
6545}
6546
6547void __stdcall glEndQuery(GLenum target)
6548{
6549 EVENT("(GLenum target = 0x%X)", target);
6550
6551 try
6552 {
6553 gl::Context *context = gl::getNonLostContext();
6554
6555 if (context)
6556 {
6557 if (context->getClientVersion() < 3)
6558 {
6559 return gl::error(GL_INVALID_OPERATION);
6560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006561
Geoff Lang37dde692014-01-31 16:34:54 -05006562 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006563 {
Geoff Lang37dde692014-01-31 16:34:54 -05006564 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006565 }
Geoff Lang37dde692014-01-31 16:34:54 -05006566
6567 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006569 }
6570 catch(std::bad_alloc&)
6571 {
6572 return gl::error(GL_OUT_OF_MEMORY);
6573 }
6574}
6575
6576void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6577{
6578 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6579
6580 try
6581 {
6582 gl::Context *context = gl::getNonLostContext();
6583
6584 if (context)
6585 {
6586 if (context->getClientVersion() < 3)
6587 {
6588 return gl::error(GL_INVALID_OPERATION);
6589 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006590
Geoff Lang37dde692014-01-31 16:34:54 -05006591 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006592 {
Geoff Lang37dde692014-01-31 16:34:54 -05006593 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006594 }
Geoff Lang37dde692014-01-31 16:34:54 -05006595
6596 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006597 {
Geoff Lang37dde692014-01-31 16:34:54 -05006598 case GL_CURRENT_QUERY:
6599 params[0] = context->getActiveQuery(target);
6600 break;
6601
6602 default:
6603 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006604 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006606 }
6607 catch(std::bad_alloc&)
6608 {
6609 return gl::error(GL_OUT_OF_MEMORY);
6610 }
6611}
6612
6613void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6614{
6615 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6616
6617 try
6618 {
6619 gl::Context *context = gl::getNonLostContext();
6620
6621 if (context)
6622 {
6623 if (context->getClientVersion() < 3)
6624 {
6625 return gl::error(GL_INVALID_OPERATION);
6626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627
Geoff Lang37dde692014-01-31 16:34:54 -05006628 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6629
6630 if (!queryObject)
6631 {
6632 return gl::error(GL_INVALID_OPERATION);
6633 }
6634
6635 if (context->getActiveQuery(queryObject->getType()) == id)
6636 {
6637 return gl::error(GL_INVALID_OPERATION);
6638 }
6639
6640 switch(pname)
6641 {
6642 case GL_QUERY_RESULT:
6643 params[0] = queryObject->getResult();
6644 break;
6645 case GL_QUERY_RESULT_AVAILABLE:
6646 params[0] = queryObject->isResultAvailable();
6647 break;
6648 default:
6649 return gl::error(GL_INVALID_ENUM);
6650 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652 }
6653 catch(std::bad_alloc&)
6654 {
6655 return gl::error(GL_OUT_OF_MEMORY);
6656 }
6657}
6658
6659GLboolean __stdcall glUnmapBuffer(GLenum target)
6660{
6661 EVENT("(GLenum target = 0x%X)", target);
6662
6663 try
6664 {
6665 gl::Context *context = gl::getNonLostContext();
6666
6667 if (context)
6668 {
6669 if (context->getClientVersion() < 3)
6670 {
6671 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6672 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006673
Shannon Woodsb3801742014-03-27 14:59:19 -04006674 return glUnmapBufferOES(target);
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, GL_FALSE);
6680 }
6681
6682 return GL_FALSE;
6683}
6684
6685void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6686{
6687 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6688
6689 try
6690 {
6691 gl::Context *context = gl::getNonLostContext();
6692
6693 if (context)
6694 {
6695 if (context->getClientVersion() < 3)
6696 {
6697 return gl::error(GL_INVALID_OPERATION);
6698 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006699
Shannon Woodsb3801742014-03-27 14:59:19 -04006700 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006701 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006702 }
6703 catch(std::bad_alloc&)
6704 {
6705 return gl::error(GL_OUT_OF_MEMORY);
6706 }
6707}
6708
6709void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6710{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006711 try
6712 {
6713 gl::Context *context = gl::getNonLostContext();
6714
6715 if (context)
6716 {
6717 if (context->getClientVersion() < 3)
6718 {
6719 return gl::error(GL_INVALID_OPERATION);
6720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006721
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006722 glDrawBuffersEXT(n, bufs);
6723 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006724 }
6725 catch(std::bad_alloc&)
6726 {
6727 return gl::error(GL_OUT_OF_MEMORY);
6728 }
6729}
6730
6731void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6732{
6733 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6734 location, count, transpose, value);
6735
6736 try
6737 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006738 if (count < 0)
6739 {
6740 return gl::error(GL_INVALID_VALUE);
6741 }
6742
6743 if (location == -1)
6744 {
6745 return;
6746 }
6747
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006748 gl::Context *context = gl::getNonLostContext();
6749
6750 if (context)
6751 {
6752 if (context->getClientVersion() < 3)
6753 {
6754 return gl::error(GL_INVALID_OPERATION);
6755 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006756
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006757 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6758 if (!programBinary)
6759 {
6760 return gl::error(GL_INVALID_OPERATION);
6761 }
6762
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006763 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006764 {
6765 return gl::error(GL_INVALID_OPERATION);
6766 }
6767 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006768 }
6769 catch(std::bad_alloc&)
6770 {
6771 return gl::error(GL_OUT_OF_MEMORY);
6772 }
6773}
6774
6775void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6776{
6777 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6778 location, count, transpose, value);
6779
6780 try
6781 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006782 if (count < 0)
6783 {
6784 return gl::error(GL_INVALID_VALUE);
6785 }
6786
6787 if (location == -1)
6788 {
6789 return;
6790 }
6791
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006792 gl::Context *context = gl::getNonLostContext();
6793
6794 if (context)
6795 {
6796 if (context->getClientVersion() < 3)
6797 {
6798 return gl::error(GL_INVALID_OPERATION);
6799 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006800
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006801 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6802 if (!programBinary)
6803 {
6804 return gl::error(GL_INVALID_OPERATION);
6805 }
6806
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006807 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006808 {
6809 return gl::error(GL_INVALID_OPERATION);
6810 }
6811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006812 }
6813 catch(std::bad_alloc&)
6814 {
6815 return gl::error(GL_OUT_OF_MEMORY);
6816 }
6817}
6818
6819void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6820{
6821 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6822 location, count, transpose, value);
6823
6824 try
6825 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006826 if (count < 0)
6827 {
6828 return gl::error(GL_INVALID_VALUE);
6829 }
6830
6831 if (location == -1)
6832 {
6833 return;
6834 }
6835
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006836 gl::Context *context = gl::getNonLostContext();
6837
6838 if (context)
6839 {
6840 if (context->getClientVersion() < 3)
6841 {
6842 return gl::error(GL_INVALID_OPERATION);
6843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006844
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006845 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6846 if (!programBinary)
6847 {
6848 return gl::error(GL_INVALID_OPERATION);
6849 }
6850
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006851 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006852 {
6853 return gl::error(GL_INVALID_OPERATION);
6854 }
6855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006856 }
6857 catch(std::bad_alloc&)
6858 {
6859 return gl::error(GL_OUT_OF_MEMORY);
6860 }
6861}
6862
6863void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6864{
6865 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6866 location, count, transpose, value);
6867
6868 try
6869 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006870 if (count < 0)
6871 {
6872 return gl::error(GL_INVALID_VALUE);
6873 }
6874
6875 if (location == -1)
6876 {
6877 return;
6878 }
6879
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006880 gl::Context *context = gl::getNonLostContext();
6881
6882 if (context)
6883 {
6884 if (context->getClientVersion() < 3)
6885 {
6886 return gl::error(GL_INVALID_OPERATION);
6887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006888
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006889 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6890 if (!programBinary)
6891 {
6892 return gl::error(GL_INVALID_OPERATION);
6893 }
6894
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006895 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006896 {
6897 return gl::error(GL_INVALID_OPERATION);
6898 }
6899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006900 }
6901 catch(std::bad_alloc&)
6902 {
6903 return gl::error(GL_OUT_OF_MEMORY);
6904 }
6905}
6906
6907void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6908{
6909 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6910 location, count, transpose, value);
6911
6912 try
6913 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006914 if (count < 0)
6915 {
6916 return gl::error(GL_INVALID_VALUE);
6917 }
6918
6919 if (location == -1)
6920 {
6921 return;
6922 }
6923
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006924 gl::Context *context = gl::getNonLostContext();
6925
6926 if (context)
6927 {
6928 if (context->getClientVersion() < 3)
6929 {
6930 return gl::error(GL_INVALID_OPERATION);
6931 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006932
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006933 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6934 if (!programBinary)
6935 {
6936 return gl::error(GL_INVALID_OPERATION);
6937 }
6938
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006939 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006940 {
6941 return gl::error(GL_INVALID_OPERATION);
6942 }
6943 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006944 }
6945 catch(std::bad_alloc&)
6946 {
6947 return gl::error(GL_OUT_OF_MEMORY);
6948 }
6949}
6950
6951void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6952{
6953 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6954 location, count, transpose, value);
6955
6956 try
6957 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006958 if (count < 0)
6959 {
6960 return gl::error(GL_INVALID_VALUE);
6961 }
6962
6963 if (location == -1)
6964 {
6965 return;
6966 }
6967
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006968 gl::Context *context = gl::getNonLostContext();
6969
6970 if (context)
6971 {
6972 if (context->getClientVersion() < 3)
6973 {
6974 return gl::error(GL_INVALID_OPERATION);
6975 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006976
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006977 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6978 if (!programBinary)
6979 {
6980 return gl::error(GL_INVALID_OPERATION);
6981 }
6982
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006983 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006984 {
6985 return gl::error(GL_INVALID_OPERATION);
6986 }
6987 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006988 }
6989 catch(std::bad_alloc&)
6990 {
6991 return gl::error(GL_OUT_OF_MEMORY);
6992 }
6993}
6994
6995void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6996{
6997 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6998 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6999 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7000
7001 try
7002 {
7003 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007004 if (context)
7005 {
7006 if (context->getClientVersion() < 3)
7007 {
7008 return gl::error(GL_INVALID_OPERATION);
7009 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007010
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007011 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007012 dstX0, dstY0, dstX1, dstY1, mask, filter,
7013 false))
7014 {
7015 return;
7016 }
7017
7018 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7019 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007021 }
7022 catch(std::bad_alloc&)
7023 {
7024 return gl::error(GL_OUT_OF_MEMORY);
7025 }
7026}
7027
7028void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7029{
7030 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7031 target, samples, internalformat, width, height);
7032
7033 try
7034 {
7035 gl::Context *context = gl::getNonLostContext();
7036
7037 if (context)
7038 {
7039 if (context->getClientVersion() < 3)
7040 {
7041 return gl::error(GL_INVALID_OPERATION);
7042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007043
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007044 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007045 width, height, false))
7046 {
7047 return;
7048 }
7049
7050 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007052 }
7053 catch(std::bad_alloc&)
7054 {
7055 return gl::error(GL_OUT_OF_MEMORY);
7056 }
7057}
7058
7059void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7060{
7061 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7062 target, attachment, texture, level, layer);
7063
7064 try
7065 {
7066 gl::Context *context = gl::getNonLostContext();
7067
7068 if (context)
7069 {
7070 if (context->getClientVersion() < 3)
7071 {
7072 return gl::error(GL_INVALID_OPERATION);
7073 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007074
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007075 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007076 {
7077 return;
7078 }
7079
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007080 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7081 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007082
7083 gl::Texture *textureObject = context->getTexture(texture);
7084 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7085
7086 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7087 {
7088 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7089 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7090 }
7091 else
7092 {
7093 switch (attachment)
7094 {
7095 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7096 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7097 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7098 }
7099 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007101 }
7102 catch(std::bad_alloc&)
7103 {
7104 return gl::error(GL_OUT_OF_MEMORY);
7105 }
7106}
7107
7108GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7109{
7110 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7111 target, offset, length, access);
7112
7113 try
7114 {
7115 gl::Context *context = gl::getNonLostContext();
7116
7117 if (context)
7118 {
7119 if (context->getClientVersion() < 3)
7120 {
7121 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007123
Shannon Woods916e7692014-03-27 16:58:22 -04007124 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007125 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007126 }
7127 catch(std::bad_alloc&)
7128 {
7129 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7130 }
7131
7132 return NULL;
7133}
7134
7135void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7136{
7137 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7138
7139 try
7140 {
7141 gl::Context *context = gl::getNonLostContext();
7142
7143 if (context)
7144 {
7145 if (context->getClientVersion() < 3)
7146 {
7147 return gl::error(GL_INVALID_OPERATION);
7148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007149
Shannon Woods916e7692014-03-27 16:58:22 -04007150 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007151 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007152 }
7153 catch(std::bad_alloc&)
7154 {
7155 return gl::error(GL_OUT_OF_MEMORY);
7156 }
7157}
7158
7159void __stdcall glBindVertexArray(GLuint array)
7160{
7161 EVENT("(GLuint array = %u)", array);
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
Jamie Madilld1028542013-07-02 11:57:04 -04007174 gl::VertexArray *vao = context->getVertexArray(array);
7175
7176 if (!vao)
7177 {
7178 // The default VAO should always exist
7179 ASSERT(array != 0);
7180 return gl::error(GL_INVALID_OPERATION);
7181 }
7182
7183 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007184 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007185 }
7186 catch(std::bad_alloc&)
7187 {
7188 return gl::error(GL_OUT_OF_MEMORY);
7189 }
7190}
7191
7192void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7193{
7194 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7195
7196 try
7197 {
7198 gl::Context *context = gl::getNonLostContext();
7199
7200 if (context)
7201 {
7202 if (context->getClientVersion() < 3)
7203 {
7204 return gl::error(GL_INVALID_OPERATION);
7205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007206
Jamie Madilld1028542013-07-02 11:57:04 -04007207 if (n < 0)
7208 {
7209 return gl::error(GL_INVALID_VALUE);
7210 }
7211
7212 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7213 {
7214 if (arrays[arrayIndex] != 0)
7215 {
7216 context->deleteVertexArray(arrays[arrayIndex]);
7217 }
7218 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007219 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007220 }
7221 catch(std::bad_alloc&)
7222 {
7223 return gl::error(GL_OUT_OF_MEMORY);
7224 }
7225}
7226
7227void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7228{
7229 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7230
7231 try
7232 {
7233 gl::Context *context = gl::getNonLostContext();
7234
7235 if (context)
7236 {
7237 if (context->getClientVersion() < 3)
7238 {
7239 return gl::error(GL_INVALID_OPERATION);
7240 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007241
Jamie Madilld1028542013-07-02 11:57:04 -04007242 if (n < 0)
7243 {
7244 return gl::error(GL_INVALID_VALUE);
7245 }
7246
7247 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7248 {
7249 arrays[arrayIndex] = context->createVertexArray();
7250 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007252 }
7253 catch(std::bad_alloc&)
7254 {
7255 return gl::error(GL_OUT_OF_MEMORY);
7256 }
7257}
7258
7259GLboolean __stdcall glIsVertexArray(GLuint array)
7260{
7261 EVENT("(GLuint array = %u)", array);
7262
7263 try
7264 {
7265 gl::Context *context = gl::getNonLostContext();
7266
7267 if (context)
7268 {
7269 if (context->getClientVersion() < 3)
7270 {
7271 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007273
Jamie Madilld1028542013-07-02 11:57:04 -04007274 if (array == 0)
7275 {
7276 return GL_FALSE;
7277 }
7278
7279 gl::VertexArray *vao = context->getVertexArray(array);
7280
7281 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007283 }
7284 catch(std::bad_alloc&)
7285 {
7286 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7287 }
7288
7289 return GL_FALSE;
7290}
7291
7292void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7293{
7294 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7295 target, index, data);
7296
7297 try
7298 {
7299 gl::Context *context = gl::getNonLostContext();
7300
7301 if (context)
7302 {
7303 if (context->getClientVersion() < 3)
7304 {
7305 return gl::error(GL_INVALID_OPERATION);
7306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007307
Shannon Woods15934d52013-08-19 14:28:49 -04007308 switch (target)
7309 {
7310 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7311 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7312 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7313 if (index >= context->getMaxTransformFeedbackBufferBindings())
7314 return gl::error(GL_INVALID_VALUE);
7315 break;
7316 case GL_UNIFORM_BUFFER_START:
7317 case GL_UNIFORM_BUFFER_SIZE:
7318 case GL_UNIFORM_BUFFER_BINDING:
7319 if (index >= context->getMaximumCombinedUniformBufferBindings())
7320 return gl::error(GL_INVALID_VALUE);
7321 break;
7322 default:
7323 return gl::error(GL_INVALID_ENUM);
7324 }
7325
7326 if (!(context->getIndexedIntegerv(target, index, data)))
7327 {
7328 GLenum nativeType;
7329 unsigned int numParams = 0;
7330 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7331 return gl::error(GL_INVALID_ENUM);
7332
7333 if (numParams == 0)
7334 return; // it is known that pname is valid, but there are no parameters to return
7335
7336 if (nativeType == GL_INT_64_ANGLEX)
7337 {
7338 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7339 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7340 GLint64 *int64Params = new GLint64[numParams];
7341
7342 context->getIndexedInteger64v(target, index, int64Params);
7343
7344 for (unsigned int i = 0; i < numParams; ++i)
7345 {
7346 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7347 data[i] = static_cast<GLint>(clampedValue);
7348 }
7349
7350 delete [] int64Params;
7351 }
7352 else
7353 {
7354 UNREACHABLE();
7355 }
7356 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007358 }
7359 catch(std::bad_alloc&)
7360 {
7361 return gl::error(GL_OUT_OF_MEMORY);
7362 }
7363}
7364
7365void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7366{
7367 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7368
7369 try
7370 {
7371 gl::Context *context = gl::getNonLostContext();
7372
7373 if (context)
7374 {
7375 if (context->getClientVersion() < 3)
7376 {
7377 return gl::error(GL_INVALID_OPERATION);
7378 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007379
Geoff Langc8058452014-02-03 12:04:11 -05007380 switch (primitiveMode)
7381 {
7382 case GL_TRIANGLES:
7383 case GL_LINES:
7384 case GL_POINTS:
7385 break;
7386 default:
7387 return gl::error(GL_INVALID_ENUM);
7388 }
7389
7390 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7391 ASSERT(transformFeedback != NULL);
7392
7393 if (transformFeedback->isStarted())
7394 {
7395 return gl::error(GL_INVALID_OPERATION);
7396 }
7397
7398 if (transformFeedback->isPaused())
7399 {
7400 transformFeedback->resume();
7401 }
7402 else
7403 {
7404 transformFeedback->start(primitiveMode);
7405 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007406 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007407 }
7408 catch(std::bad_alloc&)
7409 {
7410 return gl::error(GL_OUT_OF_MEMORY);
7411 }
7412}
7413
7414void __stdcall glEndTransformFeedback(void)
7415{
7416 EVENT("(void)");
7417
7418 try
7419 {
7420 gl::Context *context = gl::getNonLostContext();
7421
7422 if (context)
7423 {
7424 if (context->getClientVersion() < 3)
7425 {
7426 return gl::error(GL_INVALID_OPERATION);
7427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007428
Geoff Langc8058452014-02-03 12:04:11 -05007429 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7430 ASSERT(transformFeedback != NULL);
7431
7432 if (!transformFeedback->isStarted())
7433 {
7434 return gl::error(GL_INVALID_OPERATION);
7435 }
7436
7437 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007438 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007439 }
7440 catch(std::bad_alloc&)
7441 {
7442 return gl::error(GL_OUT_OF_MEMORY);
7443 }
7444}
7445
7446void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7447{
7448 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7449 target, index, buffer, offset, size);
7450
7451 try
7452 {
7453 gl::Context *context = gl::getNonLostContext();
7454
7455 if (context)
7456 {
7457 if (context->getClientVersion() < 3)
7458 {
7459 return gl::error(GL_INVALID_OPERATION);
7460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007461
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007462 switch (target)
7463 {
7464 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007465 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007466 {
7467 return gl::error(GL_INVALID_VALUE);
7468 }
7469 break;
7470
7471 case GL_UNIFORM_BUFFER:
7472 if (index >= context->getMaximumCombinedUniformBufferBindings())
7473 {
7474 return gl::error(GL_INVALID_VALUE);
7475 }
7476 break;
7477
7478 default:
7479 return gl::error(GL_INVALID_ENUM);
7480 }
7481
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007482 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007483 {
7484 return gl::error(GL_INVALID_VALUE);
7485 }
7486
7487 switch (target)
7488 {
7489 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007490
7491 // size and offset must be a multiple of 4
7492 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7493 {
7494 return gl::error(GL_INVALID_VALUE);
7495 }
7496
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007497 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7498 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007499 break;
7500
7501 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007502
7503 // it is an error to bind an offset not a multiple of the alignment
7504 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7505 {
7506 return gl::error(GL_INVALID_VALUE);
7507 }
7508
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007509 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7510 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007511 break;
7512
7513 default:
7514 UNREACHABLE();
7515 }
7516 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007517 }
7518 catch(std::bad_alloc&)
7519 {
7520 return gl::error(GL_OUT_OF_MEMORY);
7521 }
7522}
7523
7524void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7525{
7526 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7527 target, index, buffer);
7528
7529 try
7530 {
7531 gl::Context *context = gl::getNonLostContext();
7532
7533 if (context)
7534 {
7535 if (context->getClientVersion() < 3)
7536 {
7537 return gl::error(GL_INVALID_OPERATION);
7538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007539
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007540 switch (target)
7541 {
7542 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007543 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007544 {
7545 return gl::error(GL_INVALID_VALUE);
7546 }
7547 break;
7548
7549 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007550 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007551 {
7552 return gl::error(GL_INVALID_VALUE);
7553 }
7554 break;
7555
7556 default:
7557 return gl::error(GL_INVALID_ENUM);
7558 }
7559
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007560 switch (target)
7561 {
7562 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007563 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007564 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007565 break;
7566
7567 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007568 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007569 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007570 break;
7571
7572 default:
7573 UNREACHABLE();
7574 }
7575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007576 }
7577 catch(std::bad_alloc&)
7578 {
7579 return gl::error(GL_OUT_OF_MEMORY);
7580 }
7581}
7582
7583void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7584{
7585 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7586 program, count, varyings, bufferMode);
7587
7588 try
7589 {
7590 gl::Context *context = gl::getNonLostContext();
7591
7592 if (context)
7593 {
7594 if (context->getClientVersion() < 3)
7595 {
7596 return gl::error(GL_INVALID_OPERATION);
7597 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007598
Geoff Lang48dcae72014-02-05 16:28:24 -05007599 if (count < 0)
7600 {
7601 return gl::error(GL_INVALID_VALUE);
7602 }
7603
7604 switch (bufferMode)
7605 {
7606 case GL_INTERLEAVED_ATTRIBS:
7607 break;
7608 case GL_SEPARATE_ATTRIBS:
7609 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7610 {
7611 return gl::error(GL_INVALID_VALUE);
7612 }
7613 break;
7614 default:
7615 return gl::error(GL_INVALID_ENUM);
7616 }
7617
7618 if (!gl::ValidProgram(context, program))
7619 {
7620 return;
7621 }
7622
7623 gl::Program *programObject = context->getProgram(program);
7624 ASSERT(programObject);
7625
7626 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007627 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007628 }
7629 catch(std::bad_alloc&)
7630 {
7631 return gl::error(GL_OUT_OF_MEMORY);
7632 }
7633}
7634
7635void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7636{
7637 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7638 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7639 program, index, bufSize, length, size, type, name);
7640
7641 try
7642 {
7643 gl::Context *context = gl::getNonLostContext();
7644
7645 if (context)
7646 {
7647 if (context->getClientVersion() < 3)
7648 {
7649 return gl::error(GL_INVALID_OPERATION);
7650 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007651
Geoff Lang48dcae72014-02-05 16:28:24 -05007652 if (bufSize < 0)
7653 {
7654 return gl::error(GL_INVALID_VALUE);
7655 }
7656
7657 if (!gl::ValidProgram(context, program))
7658 {
7659 return;
7660 }
7661
7662 gl::Program *programObject = context->getProgram(program);
7663 ASSERT(programObject);
7664
7665 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7666 {
7667 return gl::error(GL_INVALID_VALUE);
7668 }
7669
7670 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007671 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007672 }
7673 catch(std::bad_alloc&)
7674 {
7675 return gl::error(GL_OUT_OF_MEMORY);
7676 }
7677}
7678
7679void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7680{
7681 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7682 index, size, type, stride, pointer);
7683
7684 try
7685 {
7686 gl::Context *context = gl::getNonLostContext();
7687
7688 if (context)
7689 {
7690 if (context->getClientVersion() < 3)
7691 {
7692 return gl::error(GL_INVALID_OPERATION);
7693 }
7694 }
7695
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007696 if (index >= gl::MAX_VERTEX_ATTRIBS)
7697 {
7698 return gl::error(GL_INVALID_VALUE);
7699 }
7700
7701 if (size < 1 || size > 4)
7702 {
7703 return gl::error(GL_INVALID_VALUE);
7704 }
7705
7706 switch (type)
7707 {
7708 case GL_BYTE:
7709 case GL_UNSIGNED_BYTE:
7710 case GL_SHORT:
7711 case GL_UNSIGNED_SHORT:
7712 case GL_INT:
7713 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007714 case GL_INT_2_10_10_10_REV:
7715 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007716 break;
7717 default:
7718 return gl::error(GL_INVALID_ENUM);
7719 }
7720
7721 if (stride < 0)
7722 {
7723 return gl::error(GL_INVALID_VALUE);
7724 }
7725
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007726 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7727 {
7728 return gl::error(GL_INVALID_OPERATION);
7729 }
7730
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007731 if (context)
7732 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007733 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7734 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7735 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7736 // and the pointer argument is not NULL.
7737 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7738 {
7739 return gl::error(GL_INVALID_OPERATION);
7740 }
7741
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007742 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7743 stride, pointer);
7744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007745 }
7746 catch(std::bad_alloc&)
7747 {
7748 return gl::error(GL_OUT_OF_MEMORY);
7749 }
7750}
7751
7752void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7753{
7754 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7755 index, pname, params);
7756
7757 try
7758 {
7759 gl::Context *context = gl::getNonLostContext();
7760
7761 if (context)
7762 {
7763 if (context->getClientVersion() < 3)
7764 {
7765 return gl::error(GL_INVALID_OPERATION);
7766 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007767
Jamie Madilla7d05862013-07-02 11:57:06 -04007768 if (index >= gl::MAX_VERTEX_ATTRIBS)
7769 {
7770 return gl::error(GL_INVALID_VALUE);
7771 }
7772
7773 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7774
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007775 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007776 {
7777 return;
7778 }
7779
7780 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7781 {
7782 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7783 for (int i = 0; i < 4; ++i)
7784 {
7785 params[i] = currentValueData.IntValues[i];
7786 }
7787 }
7788 else
7789 {
7790 *params = attribState.querySingleParameter<GLint>(pname);
7791 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007792 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007793 }
7794 catch(std::bad_alloc&)
7795 {
7796 return gl::error(GL_OUT_OF_MEMORY);
7797 }
7798}
7799
7800void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7801{
7802 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7803 index, pname, params);
7804
7805 try
7806 {
7807 gl::Context *context = gl::getNonLostContext();
7808
7809 if (context)
7810 {
7811 if (context->getClientVersion() < 3)
7812 {
7813 return gl::error(GL_INVALID_OPERATION);
7814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007815
Jamie Madilla7d05862013-07-02 11:57:06 -04007816 if (index >= gl::MAX_VERTEX_ATTRIBS)
7817 {
7818 return gl::error(GL_INVALID_VALUE);
7819 }
7820
7821 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7822
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007823 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007824 {
7825 return;
7826 }
7827
7828 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7829 {
7830 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7831 for (int i = 0; i < 4; ++i)
7832 {
7833 params[i] = currentValueData.UnsignedIntValues[i];
7834 }
7835 }
7836 else
7837 {
7838 *params = attribState.querySingleParameter<GLuint>(pname);
7839 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007840 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007841 }
7842 catch(std::bad_alloc&)
7843 {
7844 return gl::error(GL_OUT_OF_MEMORY);
7845 }
7846}
7847
7848void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7849{
7850 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7851 index, x, y, z, w);
7852
7853 try
7854 {
7855 gl::Context *context = gl::getNonLostContext();
7856
7857 if (context)
7858 {
7859 if (context->getClientVersion() < 3)
7860 {
7861 return gl::error(GL_INVALID_OPERATION);
7862 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007863
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007864 if (index >= gl::MAX_VERTEX_ATTRIBS)
7865 {
7866 return gl::error(GL_INVALID_VALUE);
7867 }
7868
7869 GLint vals[4] = { x, y, z, w };
7870 context->setVertexAttribi(index, vals);
7871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007872 }
7873 catch(std::bad_alloc&)
7874 {
7875 return gl::error(GL_OUT_OF_MEMORY);
7876 }
7877}
7878
7879void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7880{
7881 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7882 index, x, y, z, w);
7883
7884 try
7885 {
7886 gl::Context *context = gl::getNonLostContext();
7887
7888 if (context)
7889 {
7890 if (context->getClientVersion() < 3)
7891 {
7892 return gl::error(GL_INVALID_OPERATION);
7893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007894
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007895 if (index >= gl::MAX_VERTEX_ATTRIBS)
7896 {
7897 return gl::error(GL_INVALID_VALUE);
7898 }
7899
7900 GLuint vals[4] = { x, y, z, w };
7901 context->setVertexAttribu(index, vals);
7902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007903 }
7904 catch(std::bad_alloc&)
7905 {
7906 return gl::error(GL_OUT_OF_MEMORY);
7907 }
7908}
7909
7910void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7911{
7912 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7913
7914 try
7915 {
7916 gl::Context *context = gl::getNonLostContext();
7917
7918 if (context)
7919 {
7920 if (context->getClientVersion() < 3)
7921 {
7922 return gl::error(GL_INVALID_OPERATION);
7923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007924
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007925 if (index >= gl::MAX_VERTEX_ATTRIBS)
7926 {
7927 return gl::error(GL_INVALID_VALUE);
7928 }
7929
7930 context->setVertexAttribi(index, v);
7931 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007932 }
7933 catch(std::bad_alloc&)
7934 {
7935 return gl::error(GL_OUT_OF_MEMORY);
7936 }
7937}
7938
7939void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7940{
7941 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7942
7943 try
7944 {
7945 gl::Context *context = gl::getNonLostContext();
7946
7947 if (context)
7948 {
7949 if (context->getClientVersion() < 3)
7950 {
7951 return gl::error(GL_INVALID_OPERATION);
7952 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007953
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007954 if (index >= gl::MAX_VERTEX_ATTRIBS)
7955 {
7956 return gl::error(GL_INVALID_VALUE);
7957 }
7958
7959 context->setVertexAttribu(index, v);
7960 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007961 }
7962 catch(std::bad_alloc&)
7963 {
7964 return gl::error(GL_OUT_OF_MEMORY);
7965 }
7966}
7967
7968void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7969{
7970 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7971 program, location, params);
7972
7973 try
7974 {
7975 gl::Context *context = gl::getNonLostContext();
7976
7977 if (context)
7978 {
7979 if (context->getClientVersion() < 3)
7980 {
7981 return gl::error(GL_INVALID_OPERATION);
7982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007983
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007984 if (program == 0)
7985 {
7986 return gl::error(GL_INVALID_VALUE);
7987 }
7988
7989 gl::Program *programObject = context->getProgram(program);
7990
7991 if (!programObject || !programObject->isLinked())
7992 {
7993 return gl::error(GL_INVALID_OPERATION);
7994 }
7995
7996 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7997 if (!programBinary)
7998 {
7999 return gl::error(GL_INVALID_OPERATION);
8000 }
8001
8002 if (!programBinary->getUniformuiv(location, NULL, params))
8003 {
8004 return gl::error(GL_INVALID_OPERATION);
8005 }
8006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008007 }
8008 catch(std::bad_alloc&)
8009 {
8010 return gl::error(GL_OUT_OF_MEMORY);
8011 }
8012}
8013
8014GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8015{
8016 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8017 program, name);
8018
8019 try
8020 {
8021 gl::Context *context = gl::getNonLostContext();
8022
8023 if (context)
8024 {
8025 if (context->getClientVersion() < 3)
8026 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008027 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008029
Jamie Madilld1e78c92013-06-20 11:55:50 -04008030 if (program == 0)
8031 {
8032 return gl::error(GL_INVALID_VALUE, -1);
8033 }
8034
8035 gl::Program *programObject = context->getProgram(program);
8036
8037 if (!programObject || !programObject->isLinked())
8038 {
8039 return gl::error(GL_INVALID_OPERATION, -1);
8040 }
8041
8042 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8043 if (!programBinary)
8044 {
8045 return gl::error(GL_INVALID_OPERATION, -1);
8046 }
8047
8048 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008050 }
8051 catch(std::bad_alloc&)
8052 {
8053 return gl::error(GL_OUT_OF_MEMORY, 0);
8054 }
8055
8056 return 0;
8057}
8058
8059void __stdcall glUniform1ui(GLint location, GLuint v0)
8060{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008061 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008062}
8063
8064void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8065{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008066 const GLuint xy[] = { v0, v1 };
8067 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008068}
8069
8070void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8071{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008072 const GLuint xyz[] = { v0, v1, v2 };
8073 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008074}
8075
8076void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8077{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008078 const GLuint xyzw[] = { v0, v1, v2, v3 };
8079 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008080}
8081
8082void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8083{
8084 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8085 location, count, value);
8086
8087 try
8088 {
8089 gl::Context *context = gl::getNonLostContext();
8090
8091 if (context)
8092 {
8093 if (context->getClientVersion() < 3)
8094 {
8095 return gl::error(GL_INVALID_OPERATION);
8096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008097
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008098 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8099 if (!programBinary)
8100 {
8101 return gl::error(GL_INVALID_OPERATION);
8102 }
8103
8104 if (!programBinary->setUniform1uiv(location, count, value))
8105 {
8106 return gl::error(GL_INVALID_OPERATION);
8107 }
8108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008109 }
8110 catch(std::bad_alloc&)
8111 {
8112 return gl::error(GL_OUT_OF_MEMORY);
8113 }
8114}
8115
8116void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8117{
8118 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8119 location, count, value);
8120
8121 try
8122 {
8123 gl::Context *context = gl::getNonLostContext();
8124
8125 if (context)
8126 {
8127 if (context->getClientVersion() < 3)
8128 {
8129 return gl::error(GL_INVALID_OPERATION);
8130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008131
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008132 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8133 if (!programBinary)
8134 {
8135 return gl::error(GL_INVALID_OPERATION);
8136 }
8137
8138 if (!programBinary->setUniform2uiv(location, count, value))
8139 {
8140 return gl::error(GL_INVALID_OPERATION);
8141 }
8142 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008143 }
8144 catch(std::bad_alloc&)
8145 {
8146 return gl::error(GL_OUT_OF_MEMORY);
8147 }
8148}
8149
8150void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8151{
8152 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8153 location, count, value);
8154
8155 try
8156 {
8157 gl::Context *context = gl::getNonLostContext();
8158
8159 if (context)
8160 {
8161 if (context->getClientVersion() < 3)
8162 {
8163 return gl::error(GL_INVALID_OPERATION);
8164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008165
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008166 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8167 if (!programBinary)
8168 {
8169 return gl::error(GL_INVALID_OPERATION);
8170 }
8171
8172 if (!programBinary->setUniform3uiv(location, count, value))
8173 {
8174 return gl::error(GL_INVALID_OPERATION);
8175 }
8176 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008177 }
8178 catch(std::bad_alloc&)
8179 {
8180 return gl::error(GL_OUT_OF_MEMORY);
8181 }
8182}
8183
8184void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8185{
8186 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8187 location, count, value);
8188
8189 try
8190 {
8191 gl::Context *context = gl::getNonLostContext();
8192
8193 if (context)
8194 {
8195 if (context->getClientVersion() < 3)
8196 {
8197 return gl::error(GL_INVALID_OPERATION);
8198 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008199
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008200 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8201 if (!programBinary)
8202 {
8203 return gl::error(GL_INVALID_OPERATION);
8204 }
8205
8206 if (!programBinary->setUniform4uiv(location, count, value))
8207 {
8208 return gl::error(GL_INVALID_OPERATION);
8209 }
8210 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008211 }
8212 catch(std::bad_alloc&)
8213 {
8214 return gl::error(GL_OUT_OF_MEMORY);
8215 }
8216}
8217
8218void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8219{
8220 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8221 buffer, drawbuffer, value);
8222
8223 try
8224 {
8225 gl::Context *context = gl::getNonLostContext();
8226
8227 if (context)
8228 {
8229 if (context->getClientVersion() < 3)
8230 {
8231 return gl::error(GL_INVALID_OPERATION);
8232 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008233
Geoff Lang42359ca2013-08-21 13:25:17 -04008234 switch (buffer)
8235 {
8236 case GL_COLOR:
8237 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8238 {
8239 return gl::error(GL_INVALID_VALUE);
8240 }
8241 break;
8242 case GL_STENCIL:
8243 if (drawbuffer != 0)
8244 {
8245 return gl::error(GL_INVALID_VALUE);
8246 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008247 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008248 default:
8249 return gl::error(GL_INVALID_ENUM);
8250 }
8251
8252 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008253 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008254 }
8255 catch(std::bad_alloc&)
8256 {
8257 return gl::error(GL_OUT_OF_MEMORY);
8258 }
8259}
8260
8261void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8262{
8263 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8264 buffer, drawbuffer, value);
8265
8266 try
8267 {
8268 gl::Context *context = gl::getNonLostContext();
8269
8270 if (context)
8271 {
8272 if (context->getClientVersion() < 3)
8273 {
8274 return gl::error(GL_INVALID_OPERATION);
8275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008276
Geoff Lang42359ca2013-08-21 13:25:17 -04008277 switch (buffer)
8278 {
8279 case GL_COLOR:
8280 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8281 {
8282 return gl::error(GL_INVALID_VALUE);
8283 }
8284 break;
8285 default:
8286 return gl::error(GL_INVALID_ENUM);
8287 }
8288
8289 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008291 }
8292 catch(std::bad_alloc&)
8293 {
8294 return gl::error(GL_OUT_OF_MEMORY);
8295 }
8296}
8297
8298void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8299{
8300 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8301 buffer, drawbuffer, value);
8302
8303 try
8304 {
8305 gl::Context *context = gl::getNonLostContext();
8306
8307 if (context)
8308 {
8309 if (context->getClientVersion() < 3)
8310 {
8311 return gl::error(GL_INVALID_OPERATION);
8312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008313
Geoff Lang42359ca2013-08-21 13:25:17 -04008314 switch (buffer)
8315 {
8316 case GL_COLOR:
8317 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8318 {
8319 return gl::error(GL_INVALID_VALUE);
8320 }
8321 break;
8322 case GL_DEPTH:
8323 if (drawbuffer != 0)
8324 {
8325 return gl::error(GL_INVALID_VALUE);
8326 }
8327 break;
8328 default:
8329 return gl::error(GL_INVALID_ENUM);
8330 }
8331
8332 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008334 }
8335 catch(std::bad_alloc&)
8336 {
8337 return gl::error(GL_OUT_OF_MEMORY);
8338 }
8339}
8340
8341void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8342{
8343 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8344 buffer, drawbuffer, depth, stencil);
8345
8346 try
8347 {
8348 gl::Context *context = gl::getNonLostContext();
8349
8350 if (context)
8351 {
8352 if (context->getClientVersion() < 3)
8353 {
8354 return gl::error(GL_INVALID_OPERATION);
8355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008356
Geoff Lang42359ca2013-08-21 13:25:17 -04008357 switch (buffer)
8358 {
8359 case GL_DEPTH_STENCIL:
8360 if (drawbuffer != 0)
8361 {
8362 return gl::error(GL_INVALID_VALUE);
8363 }
8364 break;
8365 default:
8366 return gl::error(GL_INVALID_ENUM);
8367 }
8368
8369 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008370 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008371 }
8372 catch(std::bad_alloc&)
8373 {
8374 return gl::error(GL_OUT_OF_MEMORY);
8375 }
8376}
8377
8378const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8379{
8380 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8381
8382 try
8383 {
8384 gl::Context *context = gl::getNonLostContext();
8385
8386 if (context)
8387 {
8388 if (context->getClientVersion() < 3)
8389 {
8390 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008392
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008393 if (name != GL_EXTENSIONS)
8394 {
8395 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8396 }
8397
8398 if (index >= context->getNumExtensions())
8399 {
8400 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8401 }
8402
8403 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8404 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008405 }
8406 catch(std::bad_alloc&)
8407 {
8408 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8409 }
8410
8411 return NULL;
8412}
8413
8414void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8415{
8416 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8417 readTarget, writeTarget, readOffset, writeOffset, size);
8418
8419 try
8420 {
8421 gl::Context *context = gl::getNonLostContext();
8422
8423 if (context)
8424 {
8425 if (context->getClientVersion() < 3)
8426 {
8427 return gl::error(GL_INVALID_OPERATION);
8428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008429
Jamie Madill8c96d582014-03-05 15:01:23 -05008430 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008431 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008432 return gl::error(GL_INVALID_ENUM);
8433 }
8434
Jamie Madill8c96d582014-03-05 15:01:23 -05008435 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8436 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008437
8438 if (!readBuffer || !writeBuffer)
8439 {
8440 return gl::error(GL_INVALID_OPERATION);
8441 }
8442
Jamie Madill7a5f7382014-03-05 15:01:24 -05008443 if (readBuffer->mapped() || writeBuffer->mapped())
8444 {
8445 return gl::error(GL_INVALID_OPERATION);
8446 }
8447
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008448 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8449 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8450 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8451 {
8452 return gl::error(GL_INVALID_VALUE);
8453 }
8454
8455 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8456 {
8457 return gl::error(GL_INVALID_VALUE);
8458 }
8459
8460 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8461
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008462 // if size is zero, the copy is a successful no-op
8463 if (size > 0)
8464 {
8465 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8466 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008468 }
8469 catch(std::bad_alloc&)
8470 {
8471 return gl::error(GL_OUT_OF_MEMORY);
8472 }
8473}
8474
8475void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8476{
8477 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8478 program, uniformCount, uniformNames, uniformIndices);
8479
8480 try
8481 {
8482 gl::Context *context = gl::getNonLostContext();
8483
8484 if (context)
8485 {
8486 if (context->getClientVersion() < 3)
8487 {
8488 return gl::error(GL_INVALID_OPERATION);
8489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008490
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008491 if (uniformCount < 0)
8492 {
8493 return gl::error(GL_INVALID_VALUE);
8494 }
8495
8496 gl::Program *programObject = context->getProgram(program);
8497
8498 if (!programObject)
8499 {
8500 if (context->getShader(program))
8501 {
8502 return gl::error(GL_INVALID_OPERATION);
8503 }
8504 else
8505 {
8506 return gl::error(GL_INVALID_VALUE);
8507 }
8508 }
8509
8510 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8511 if (!programObject->isLinked() || !programBinary)
8512 {
8513 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8514 {
8515 uniformIndices[uniformId] = GL_INVALID_INDEX;
8516 }
8517 }
8518 else
8519 {
8520 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8521 {
8522 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8523 }
8524 }
8525 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008526 }
8527 catch(std::bad_alloc&)
8528 {
8529 return gl::error(GL_OUT_OF_MEMORY);
8530 }
8531}
8532
8533void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8534{
8535 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8536 program, uniformCount, uniformIndices, pname, params);
8537
8538 try
8539 {
8540 gl::Context *context = gl::getNonLostContext();
8541
8542 if (context)
8543 {
8544 if (context->getClientVersion() < 3)
8545 {
8546 return gl::error(GL_INVALID_OPERATION);
8547 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008548
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008549 if (uniformCount < 0)
8550 {
8551 return gl::error(GL_INVALID_VALUE);
8552 }
8553
8554 gl::Program *programObject = context->getProgram(program);
8555
8556 if (!programObject)
8557 {
8558 if (context->getShader(program))
8559 {
8560 return gl::error(GL_INVALID_OPERATION);
8561 }
8562 else
8563 {
8564 return gl::error(GL_INVALID_VALUE);
8565 }
8566 }
8567
8568 switch (pname)
8569 {
8570 case GL_UNIFORM_TYPE:
8571 case GL_UNIFORM_SIZE:
8572 case GL_UNIFORM_NAME_LENGTH:
8573 case GL_UNIFORM_BLOCK_INDEX:
8574 case GL_UNIFORM_OFFSET:
8575 case GL_UNIFORM_ARRAY_STRIDE:
8576 case GL_UNIFORM_MATRIX_STRIDE:
8577 case GL_UNIFORM_IS_ROW_MAJOR:
8578 break;
8579 default:
8580 return gl::error(GL_INVALID_ENUM);
8581 }
8582
8583 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8584
8585 if (!programBinary && uniformCount > 0)
8586 {
8587 return gl::error(GL_INVALID_VALUE);
8588 }
8589
8590 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8591 {
8592 const GLuint index = uniformIndices[uniformId];
8593
8594 if (index >= (GLuint)programBinary->getActiveUniformCount())
8595 {
8596 return gl::error(GL_INVALID_VALUE);
8597 }
8598 }
8599
8600 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8601 {
8602 const GLuint index = uniformIndices[uniformId];
8603 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8604 }
8605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008606 }
8607 catch(std::bad_alloc&)
8608 {
8609 return gl::error(GL_OUT_OF_MEMORY);
8610 }
8611}
8612
8613GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8614{
8615 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8616
8617 try
8618 {
8619 gl::Context *context = gl::getNonLostContext();
8620
8621 if (context)
8622 {
8623 if (context->getClientVersion() < 3)
8624 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008625 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008627
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008628 gl::Program *programObject = context->getProgram(program);
8629
8630 if (!programObject)
8631 {
8632 if (context->getShader(program))
8633 {
8634 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8635 }
8636 else
8637 {
8638 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8639 }
8640 }
8641
8642 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8643 if (!programBinary)
8644 {
8645 return GL_INVALID_INDEX;
8646 }
8647
8648 return programBinary->getUniformBlockIndex(uniformBlockName);
8649 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008650 }
8651 catch(std::bad_alloc&)
8652 {
8653 return gl::error(GL_OUT_OF_MEMORY, 0);
8654 }
8655
8656 return 0;
8657}
8658
8659void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8660{
8661 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8662 program, uniformBlockIndex, pname, params);
8663
8664 try
8665 {
8666 gl::Context *context = gl::getNonLostContext();
8667
8668 if (context)
8669 {
8670 if (context->getClientVersion() < 3)
8671 {
8672 return gl::error(GL_INVALID_OPERATION);
8673 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008674 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008675
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008676 if (!programObject)
8677 {
8678 if (context->getShader(program))
8679 {
8680 return gl::error(GL_INVALID_OPERATION);
8681 }
8682 else
8683 {
8684 return gl::error(GL_INVALID_VALUE);
8685 }
8686 }
8687
8688 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8689
8690 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8691 {
8692 return gl::error(GL_INVALID_VALUE);
8693 }
8694
8695 switch (pname)
8696 {
8697 case GL_UNIFORM_BLOCK_BINDING:
8698 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8699 break;
8700
8701 case GL_UNIFORM_BLOCK_DATA_SIZE:
8702 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8703 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8704 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8705 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8706 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8707 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8708 break;
8709
8710 default:
8711 return gl::error(GL_INVALID_ENUM);
8712 }
8713 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008714 }
8715 catch(std::bad_alloc&)
8716 {
8717 return gl::error(GL_OUT_OF_MEMORY);
8718 }
8719}
8720
8721void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8722{
8723 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8724 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8725
8726 try
8727 {
8728 gl::Context *context = gl::getNonLostContext();
8729
8730 if (context)
8731 {
8732 if (context->getClientVersion() < 3)
8733 {
8734 return gl::error(GL_INVALID_OPERATION);
8735 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008736
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008737 gl::Program *programObject = context->getProgram(program);
8738
8739 if (!programObject)
8740 {
8741 if (context->getShader(program))
8742 {
8743 return gl::error(GL_INVALID_OPERATION);
8744 }
8745 else
8746 {
8747 return gl::error(GL_INVALID_VALUE);
8748 }
8749 }
8750
8751 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8752
8753 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8754 {
8755 return gl::error(GL_INVALID_VALUE);
8756 }
8757
8758 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008760 }
8761 catch(std::bad_alloc&)
8762 {
8763 return gl::error(GL_OUT_OF_MEMORY);
8764 }
8765}
8766
8767void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8768{
8769 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8770 program, uniformBlockIndex, uniformBlockBinding);
8771
8772 try
8773 {
8774 gl::Context *context = gl::getNonLostContext();
8775
8776 if (context)
8777 {
8778 if (context->getClientVersion() < 3)
8779 {
8780 return gl::error(GL_INVALID_OPERATION);
8781 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008782
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008783 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8784 {
8785 return gl::error(GL_INVALID_VALUE);
8786 }
8787
8788 gl::Program *programObject = context->getProgram(program);
8789
8790 if (!programObject)
8791 {
8792 if (context->getShader(program))
8793 {
8794 return gl::error(GL_INVALID_OPERATION);
8795 }
8796 else
8797 {
8798 return gl::error(GL_INVALID_VALUE);
8799 }
8800 }
8801
8802 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8803
8804 // if never linked, there won't be any uniform blocks
8805 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8806 {
8807 return gl::error(GL_INVALID_VALUE);
8808 }
8809
8810 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008812 }
8813 catch(std::bad_alloc&)
8814 {
8815 return gl::error(GL_OUT_OF_MEMORY);
8816 }
8817}
8818
8819void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8820{
8821 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8822 mode, first, count, instanceCount);
8823
8824 try
8825 {
8826 gl::Context *context = gl::getNonLostContext();
8827
8828 if (context)
8829 {
8830 if (context->getClientVersion() < 3)
8831 {
8832 return gl::error(GL_INVALID_OPERATION);
8833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008834
Jamie Madill54133512013-06-21 09:33:07 -04008835 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008836 UNIMPLEMENTED();
8837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008838 }
8839 catch(std::bad_alloc&)
8840 {
8841 return gl::error(GL_OUT_OF_MEMORY);
8842 }
8843}
8844
8845void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8846{
8847 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8848 mode, count, type, indices, instanceCount);
8849
8850 try
8851 {
8852 gl::Context *context = gl::getNonLostContext();
8853
8854 if (context)
8855 {
8856 if (context->getClientVersion() < 3)
8857 {
8858 return gl::error(GL_INVALID_OPERATION);
8859 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008860
Jamie Madill54133512013-06-21 09:33:07 -04008861 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008862 UNIMPLEMENTED();
8863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008864 }
8865 catch(std::bad_alloc&)
8866 {
8867 return gl::error(GL_OUT_OF_MEMORY);
8868 }
8869}
8870
8871GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8872{
8873 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8874
8875 try
8876 {
8877 gl::Context *context = gl::getNonLostContext();
8878
8879 if (context)
8880 {
8881 if (context->getClientVersion() < 3)
8882 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008883 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885
Jamie Madill5215e1a2013-07-26 11:55:19 -04008886 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8887 {
8888 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8889 }
8890
8891 if (flags != 0)
8892 {
8893 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8894 }
8895
8896 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008898 }
8899 catch(std::bad_alloc&)
8900 {
8901 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8902 }
8903
8904 return NULL;
8905}
8906
8907GLboolean __stdcall glIsSync(GLsync sync)
8908{
8909 EVENT("(GLsync sync = 0x%0.8p)", sync);
8910
8911 try
8912 {
8913 gl::Context *context = gl::getNonLostContext();
8914
8915 if (context)
8916 {
8917 if (context->getClientVersion() < 3)
8918 {
8919 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008921
Jamie Madill5215e1a2013-07-26 11:55:19 -04008922 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008924 }
8925 catch(std::bad_alloc&)
8926 {
8927 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8928 }
8929
8930 return GL_FALSE;
8931}
8932
8933void __stdcall glDeleteSync(GLsync sync)
8934{
8935 EVENT("(GLsync sync = 0x%0.8p)", sync);
8936
8937 try
8938 {
8939 gl::Context *context = gl::getNonLostContext();
8940
8941 if (context)
8942 {
8943 if (context->getClientVersion() < 3)
8944 {
8945 return gl::error(GL_INVALID_OPERATION);
8946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008947
Jamie Madill5215e1a2013-07-26 11:55:19 -04008948 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8949 {
8950 return gl::error(GL_INVALID_VALUE);
8951 }
8952
8953 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008954 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008955 }
8956 catch(std::bad_alloc&)
8957 {
8958 return gl::error(GL_OUT_OF_MEMORY);
8959 }
8960}
8961
8962GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8963{
8964 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8965 sync, flags, timeout);
8966
8967 try
8968 {
8969 gl::Context *context = gl::getNonLostContext();
8970
8971 if (context)
8972 {
8973 if (context->getClientVersion() < 3)
8974 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008975 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008977
Jamie Madill5215e1a2013-07-26 11:55:19 -04008978 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8979 {
8980 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8981 }
8982
8983 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8984
8985 if (!fenceSync)
8986 {
8987 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8988 }
8989
8990 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008991 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008992 }
8993 catch(std::bad_alloc&)
8994 {
8995 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8996 }
8997
8998 return GL_FALSE;
8999}
9000
9001void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9002{
9003 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9004 sync, flags, timeout);
9005
9006 try
9007 {
9008 gl::Context *context = gl::getNonLostContext();
9009
9010 if (context)
9011 {
9012 if (context->getClientVersion() < 3)
9013 {
9014 return gl::error(GL_INVALID_OPERATION);
9015 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016
Jamie Madill5215e1a2013-07-26 11:55:19 -04009017 if (flags != 0)
9018 {
9019 return gl::error(GL_INVALID_VALUE);
9020 }
9021
9022 if (timeout != GL_TIMEOUT_IGNORED)
9023 {
9024 return gl::error(GL_INVALID_VALUE);
9025 }
9026
9027 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9028
9029 if (!fenceSync)
9030 {
9031 return gl::error(GL_INVALID_VALUE);
9032 }
9033
9034 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009035 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009036 }
9037 catch(std::bad_alloc&)
9038 {
9039 return gl::error(GL_OUT_OF_MEMORY);
9040 }
9041}
9042
9043void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9044{
9045 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9046 pname, params);
9047
9048 try
9049 {
9050 gl::Context *context = gl::getNonLostContext();
9051
9052 if (context)
9053 {
9054 if (context->getClientVersion() < 3)
9055 {
9056 return gl::error(GL_INVALID_OPERATION);
9057 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009058
Jamie Madill79f2f452013-12-19 11:13:02 -05009059 GLenum nativeType;
9060 unsigned int numParams = 0;
9061 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9062 return gl::error(GL_INVALID_ENUM);
9063
9064 // pname is valid, but that there are no parameters to return.
9065 if (numParams == 0)
9066 return;
9067
9068 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009069 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009070 context->getInteger64v(pname, params);
9071 }
Jamie Madill55856b12014-01-02 13:59:50 -05009072 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009073 {
Jamie Madill55856b12014-01-02 13:59:50 -05009074 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009075 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009076 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009077 }
9078 catch(std::bad_alloc&)
9079 {
9080 return gl::error(GL_OUT_OF_MEMORY);
9081 }
9082}
9083
9084void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9085{
9086 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9087 sync, pname, bufSize, length, values);
9088
9089 try
9090 {
9091 gl::Context *context = gl::getNonLostContext();
9092
9093 if (context)
9094 {
9095 if (context->getClientVersion() < 3)
9096 {
9097 return gl::error(GL_INVALID_OPERATION);
9098 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009099
Jamie Madill5215e1a2013-07-26 11:55:19 -04009100 if (bufSize < 0)
9101 {
9102 return gl::error(GL_INVALID_VALUE);
9103 }
9104
9105 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9106
9107 if (!fenceSync)
9108 {
9109 return gl::error(GL_INVALID_VALUE);
9110 }
9111
9112 switch (pname)
9113 {
9114 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9115 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9116 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9117 case GL_SYNC_FLAGS: values[0] = 0; break;
9118
9119 default:
9120 return gl::error(GL_INVALID_ENUM);
9121 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009123 }
9124 catch(std::bad_alloc&)
9125 {
9126 return gl::error(GL_OUT_OF_MEMORY);
9127 }
9128}
9129
9130void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9131{
9132 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9133 target, index, data);
9134
9135 try
9136 {
9137 gl::Context *context = gl::getNonLostContext();
9138
9139 if (context)
9140 {
9141 if (context->getClientVersion() < 3)
9142 {
9143 return gl::error(GL_INVALID_OPERATION);
9144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009145
Shannon Woods15934d52013-08-19 14:28:49 -04009146 switch (target)
9147 {
9148 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9149 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9150 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9151 if (index >= context->getMaxTransformFeedbackBufferBindings())
9152 return gl::error(GL_INVALID_VALUE);
9153 break;
9154 case GL_UNIFORM_BUFFER_START:
9155 case GL_UNIFORM_BUFFER_SIZE:
9156 case GL_UNIFORM_BUFFER_BINDING:
9157 if (index >= context->getMaximumCombinedUniformBufferBindings())
9158 return gl::error(GL_INVALID_VALUE);
9159 break;
9160 default:
9161 return gl::error(GL_INVALID_ENUM);
9162 }
9163
9164 if (!(context->getIndexedInteger64v(target, index, data)))
9165 {
9166 GLenum nativeType;
9167 unsigned int numParams = 0;
9168 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9169 return gl::error(GL_INVALID_ENUM);
9170
9171 if (numParams == 0)
9172 return; // it is known that pname is valid, but there are no parameters to return
9173
9174 if (nativeType == GL_INT)
9175 {
9176 GLint *intParams = new GLint[numParams];
9177
9178 context->getIndexedIntegerv(target, index, intParams);
9179
9180 for (unsigned int i = 0; i < numParams; ++i)
9181 {
9182 data[i] = static_cast<GLint64>(intParams[i]);
9183 }
9184
9185 delete [] intParams;
9186 }
9187 else
9188 {
9189 UNREACHABLE();
9190 }
9191 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009192 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009193 }
9194 catch(std::bad_alloc&)
9195 {
9196 return gl::error(GL_OUT_OF_MEMORY);
9197 }
9198}
9199
9200void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9201{
9202 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9203 target, pname, params);
9204
9205 try
9206 {
9207 gl::Context *context = gl::getNonLostContext();
9208
9209 if (context)
9210 {
9211 if (context->getClientVersion() < 3)
9212 {
9213 return gl::error(GL_INVALID_OPERATION);
9214 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009215
Jamie Madill70656a62014-03-05 15:01:26 -05009216 if (!gl::ValidBufferTarget(context, target))
9217 {
9218 return gl::error(GL_INVALID_ENUM);
9219 }
9220
9221 if (!gl::ValidBufferParameter(context, pname))
9222 {
9223 return gl::error(GL_INVALID_ENUM);
9224 }
9225
9226 gl::Buffer *buffer = context->getTargetBuffer(target);
9227
9228 if (!buffer)
9229 {
9230 // A null buffer means that "0" is bound to the requested buffer target
9231 return gl::error(GL_INVALID_OPERATION);
9232 }
9233
9234 switch (pname)
9235 {
9236 case GL_BUFFER_USAGE:
9237 *params = static_cast<GLint64>(buffer->usage());
9238 break;
9239 case GL_BUFFER_SIZE:
9240 *params = buffer->size();
9241 break;
9242 case GL_BUFFER_ACCESS_FLAGS:
9243 *params = static_cast<GLint64>(buffer->accessFlags());
9244 break;
9245 case GL_BUFFER_MAPPED:
9246 *params = static_cast<GLint64>(buffer->mapped());
9247 break;
9248 case GL_BUFFER_MAP_OFFSET:
9249 *params = buffer->mapOffset();
9250 break;
9251 case GL_BUFFER_MAP_LENGTH:
9252 *params = buffer->mapLength();
9253 break;
9254 default: UNREACHABLE(); break;
9255 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009256 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009257 }
9258 catch(std::bad_alloc&)
9259 {
9260 return gl::error(GL_OUT_OF_MEMORY);
9261 }
9262}
9263
9264void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9265{
9266 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9267
9268 try
9269 {
9270 gl::Context *context = gl::getNonLostContext();
9271
9272 if (context)
9273 {
9274 if (context->getClientVersion() < 3)
9275 {
9276 return gl::error(GL_INVALID_OPERATION);
9277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009278
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009279 if (count < 0)
9280 {
9281 return gl::error(GL_INVALID_VALUE);
9282 }
9283
9284 for (int i = 0; i < count; i++)
9285 {
9286 samplers[i] = context->createSampler();
9287 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009288 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009289 }
9290 catch(std::bad_alloc&)
9291 {
9292 return gl::error(GL_OUT_OF_MEMORY);
9293 }
9294}
9295
9296void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9297{
9298 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9299
9300 try
9301 {
9302 gl::Context *context = gl::getNonLostContext();
9303
9304 if (context)
9305 {
9306 if (context->getClientVersion() < 3)
9307 {
9308 return gl::error(GL_INVALID_OPERATION);
9309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009310
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009311 if (count < 0)
9312 {
9313 return gl::error(GL_INVALID_VALUE);
9314 }
9315
9316 for (int i = 0; i < count; i++)
9317 {
9318 context->deleteSampler(samplers[i]);
9319 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009320 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009321 }
9322 catch(std::bad_alloc&)
9323 {
9324 return gl::error(GL_OUT_OF_MEMORY);
9325 }
9326}
9327
9328GLboolean __stdcall glIsSampler(GLuint sampler)
9329{
9330 EVENT("(GLuint sampler = %u)", sampler);
9331
9332 try
9333 {
9334 gl::Context *context = gl::getNonLostContext();
9335
9336 if (context)
9337 {
9338 if (context->getClientVersion() < 3)
9339 {
9340 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009342
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009343 return context->isSampler(sampler);
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, GL_FALSE);
9349 }
9350
9351 return GL_FALSE;
9352}
9353
9354void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9355{
9356 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9357
9358 try
9359 {
9360 gl::Context *context = gl::getNonLostContext();
9361
9362 if (context)
9363 {
9364 if (context->getClientVersion() < 3)
9365 {
9366 return gl::error(GL_INVALID_OPERATION);
9367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009368
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009369 if (sampler != 0 && !context->isSampler(sampler))
9370 {
9371 return gl::error(GL_INVALID_OPERATION);
9372 }
9373
9374 if (unit >= context->getMaximumCombinedTextureImageUnits())
9375 {
9376 return gl::error(GL_INVALID_VALUE);
9377 }
9378
9379 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009381 }
9382 catch(std::bad_alloc&)
9383 {
9384 return gl::error(GL_OUT_OF_MEMORY);
9385 }
9386}
9387
9388void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9389{
9390 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9391
9392 try
9393 {
9394 gl::Context *context = gl::getNonLostContext();
9395
9396 if (context)
9397 {
9398 if (context->getClientVersion() < 3)
9399 {
9400 return gl::error(GL_INVALID_OPERATION);
9401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009402
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009403 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009404 {
9405 return;
9406 }
9407
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009408 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009409 {
9410 return;
9411 }
9412
9413 if (!context->isSampler(sampler))
9414 {
9415 return gl::error(GL_INVALID_OPERATION);
9416 }
9417
9418 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009420 }
9421 catch(std::bad_alloc&)
9422 {
9423 return gl::error(GL_OUT_OF_MEMORY);
9424 }
9425}
9426
9427void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9428{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009429 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009430}
9431
9432void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9433{
9434 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9435
9436 try
9437 {
9438 gl::Context *context = gl::getNonLostContext();
9439
9440 if (context)
9441 {
9442 if (context->getClientVersion() < 3)
9443 {
9444 return gl::error(GL_INVALID_OPERATION);
9445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009446
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009447 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009448 {
9449 return;
9450 }
9451
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009452 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009453 {
9454 return;
9455 }
9456
9457 if (!context->isSampler(sampler))
9458 {
9459 return gl::error(GL_INVALID_OPERATION);
9460 }
9461
9462 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009463 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009464 }
9465 catch(std::bad_alloc&)
9466 {
9467 return gl::error(GL_OUT_OF_MEMORY);
9468 }
9469}
9470
9471void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9472{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009473 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009474}
9475
9476void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9477{
9478 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9479
9480 try
9481 {
9482 gl::Context *context = gl::getNonLostContext();
9483
9484 if (context)
9485 {
9486 if (context->getClientVersion() < 3)
9487 {
9488 return gl::error(GL_INVALID_OPERATION);
9489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009490
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009491 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009492 {
9493 return;
9494 }
9495
9496 if (!context->isSampler(sampler))
9497 {
9498 return gl::error(GL_INVALID_OPERATION);
9499 }
9500
9501 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009503 }
9504 catch(std::bad_alloc&)
9505 {
9506 return gl::error(GL_OUT_OF_MEMORY);
9507 }
9508}
9509
9510void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9511{
9512 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9513
9514 try
9515 {
9516 gl::Context *context = gl::getNonLostContext();
9517
9518 if (context)
9519 {
9520 if (context->getClientVersion() < 3)
9521 {
9522 return gl::error(GL_INVALID_OPERATION);
9523 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009524
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009525 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009526 {
9527 return;
9528 }
9529
9530 if (!context->isSampler(sampler))
9531 {
9532 return gl::error(GL_INVALID_OPERATION);
9533 }
9534
9535 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009536 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009537 }
9538 catch(std::bad_alloc&)
9539 {
9540 return gl::error(GL_OUT_OF_MEMORY);
9541 }
9542}
9543
9544void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9545{
9546 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9547
9548 try
9549 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009550 if (index >= gl::MAX_VERTEX_ATTRIBS)
9551 {
9552 return gl::error(GL_INVALID_VALUE);
9553 }
9554
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009555 gl::Context *context = gl::getNonLostContext();
9556
9557 if (context)
9558 {
9559 if (context->getClientVersion() < 3)
9560 {
9561 return gl::error(GL_INVALID_OPERATION);
9562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009563
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009564 context->setVertexAttribDivisor(index, divisor);
9565 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009566 }
9567 catch(std::bad_alloc&)
9568 {
9569 return gl::error(GL_OUT_OF_MEMORY);
9570 }
9571}
9572
9573void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9574{
9575 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9576
9577 try
9578 {
9579 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
Geoff Langc8058452014-02-03 12:04:11 -05009588 switch (target)
9589 {
9590 case GL_TRANSFORM_FEEDBACK:
9591 {
9592 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9593 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9594 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9595 {
9596 return gl::error(GL_INVALID_OPERATION);
9597 }
9598
9599 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9600 if (context->getTransformFeedback(id) == NULL)
9601 {
9602 return gl::error(GL_INVALID_OPERATION);
9603 }
9604
9605 context->bindTransformFeedback(id);
9606 }
9607 break;
9608
9609 default:
9610 return gl::error(GL_INVALID_ENUM);
9611 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009613 }
9614 catch(std::bad_alloc&)
9615 {
9616 return gl::error(GL_OUT_OF_MEMORY);
9617 }
9618}
9619
9620void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9621{
9622 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9623
9624 try
9625 {
9626 gl::Context *context = gl::getNonLostContext();
9627
9628 if (context)
9629 {
9630 if (context->getClientVersion() < 3)
9631 {
9632 return gl::error(GL_INVALID_OPERATION);
9633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009634
Geoff Langc8058452014-02-03 12:04:11 -05009635 for (int i = 0; i < n; i++)
9636 {
9637 context->deleteTransformFeedback(ids[i]);
9638 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009639 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009640 }
9641 catch(std::bad_alloc&)
9642 {
9643 return gl::error(GL_OUT_OF_MEMORY);
9644 }
9645}
9646
9647void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9648{
9649 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9650
9651 try
9652 {
9653 gl::Context *context = gl::getNonLostContext();
9654
9655 if (context)
9656 {
9657 if (context->getClientVersion() < 3)
9658 {
9659 return gl::error(GL_INVALID_OPERATION);
9660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009661
Geoff Langc8058452014-02-03 12:04:11 -05009662 for (int i = 0; i < n; i++)
9663 {
9664 ids[i] = context->createTransformFeedback();
9665 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009667 }
9668 catch(std::bad_alloc&)
9669 {
9670 return gl::error(GL_OUT_OF_MEMORY);
9671 }
9672}
9673
9674GLboolean __stdcall glIsTransformFeedback(GLuint id)
9675{
9676 EVENT("(GLuint id = %u)", id);
9677
9678 try
9679 {
9680 gl::Context *context = gl::getNonLostContext();
9681
9682 if (context)
9683 {
9684 if (context->getClientVersion() < 3)
9685 {
9686 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9687 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009688
Geoff Langc8058452014-02-03 12:04:11 -05009689 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
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, GL_FALSE);
9695 }
9696
9697 return GL_FALSE;
9698}
9699
9700void __stdcall glPauseTransformFeedback(void)
9701{
9702 EVENT("(void)");
9703
9704 try
9705 {
9706 gl::Context *context = gl::getNonLostContext();
9707
9708 if (context)
9709 {
9710 if (context->getClientVersion() < 3)
9711 {
9712 return gl::error(GL_INVALID_OPERATION);
9713 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009714
Geoff Langc8058452014-02-03 12:04:11 -05009715 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9716 ASSERT(transformFeedback != NULL);
9717
9718 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9719 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9720 {
9721 return gl::error(GL_INVALID_OPERATION);
9722 }
9723
9724 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009725 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009726 }
9727 catch(std::bad_alloc&)
9728 {
9729 return gl::error(GL_OUT_OF_MEMORY);
9730 }
9731}
9732
9733void __stdcall glResumeTransformFeedback(void)
9734{
9735 EVENT("(void)");
9736
9737 try
9738 {
9739 gl::Context *context = gl::getNonLostContext();
9740
9741 if (context)
9742 {
9743 if (context->getClientVersion() < 3)
9744 {
9745 return gl::error(GL_INVALID_OPERATION);
9746 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009747
Geoff Langc8058452014-02-03 12:04:11 -05009748 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9749 ASSERT(transformFeedback != NULL);
9750
9751 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9752 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9753 {
9754 return gl::error(GL_INVALID_OPERATION);
9755 }
9756
9757 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009758 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009759 }
9760 catch(std::bad_alloc&)
9761 {
9762 return gl::error(GL_OUT_OF_MEMORY);
9763 }
9764}
9765
9766void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9767{
9768 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9769 program, bufSize, length, binaryFormat, binary);
9770
9771 try
9772 {
9773 gl::Context *context = gl::getNonLostContext();
9774
9775 if (context)
9776 {
9777 if (context->getClientVersion() < 3)
9778 {
9779 return gl::error(GL_INVALID_OPERATION);
9780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009781
Jamie Madill54133512013-06-21 09:33:07 -04009782 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009783 UNIMPLEMENTED();
9784 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009785 }
9786 catch(std::bad_alloc&)
9787 {
9788 return gl::error(GL_OUT_OF_MEMORY);
9789 }
9790}
9791
9792void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9793{
9794 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9795 program, binaryFormat, binary, length);
9796
9797 try
9798 {
9799 gl::Context *context = gl::getNonLostContext();
9800
9801 if (context)
9802 {
9803 if (context->getClientVersion() < 3)
9804 {
9805 return gl::error(GL_INVALID_OPERATION);
9806 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009807
Jamie Madill54133512013-06-21 09:33:07 -04009808 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009809 UNIMPLEMENTED();
9810 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009811 }
9812 catch(std::bad_alloc&)
9813 {
9814 return gl::error(GL_OUT_OF_MEMORY);
9815 }
9816}
9817
9818void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9819{
9820 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9821 program, pname, value);
9822
9823 try
9824 {
9825 gl::Context *context = gl::getNonLostContext();
9826
9827 if (context)
9828 {
9829 if (context->getClientVersion() < 3)
9830 {
9831 return gl::error(GL_INVALID_OPERATION);
9832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009833
Jamie Madill54133512013-06-21 09:33:07 -04009834 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009835 UNIMPLEMENTED();
9836 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009837 }
9838 catch(std::bad_alloc&)
9839 {
9840 return gl::error(GL_OUT_OF_MEMORY);
9841 }
9842}
9843
9844void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9845{
9846 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9847 target, numAttachments, attachments);
9848
9849 try
9850 {
9851 gl::Context *context = gl::getNonLostContext();
9852
9853 if (context)
9854 {
9855 if (context->getClientVersion() < 3)
9856 {
9857 return gl::error(GL_INVALID_OPERATION);
9858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009859
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009860 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009861 {
9862 return;
9863 }
9864
9865 int maxDimension = context->getMaximumRenderbufferDimension();
9866 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009868 }
9869 catch(std::bad_alloc&)
9870 {
9871 return gl::error(GL_OUT_OF_MEMORY);
9872 }
9873}
9874
9875void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9876{
9877 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9878 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9879 target, numAttachments, attachments, x, y, width, height);
9880
9881 try
9882 {
9883 gl::Context *context = gl::getNonLostContext();
9884
9885 if (context)
9886 {
9887 if (context->getClientVersion() < 3)
9888 {
9889 return gl::error(GL_INVALID_OPERATION);
9890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009891
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009892 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009893 {
9894 return;
9895 }
9896
9897 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9898 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009899 }
9900 catch(std::bad_alloc&)
9901 {
9902 return gl::error(GL_OUT_OF_MEMORY);
9903 }
9904}
9905
9906void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9907{
9908 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9909 target, levels, internalformat, width, height);
9910
9911 try
9912 {
9913 gl::Context *context = gl::getNonLostContext();
9914
9915 if (context)
9916 {
9917 if (context->getClientVersion() < 3)
9918 {
9919 return gl::error(GL_INVALID_OPERATION);
9920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009921
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009922 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009923 {
9924 return;
9925 }
9926
9927 switch (target)
9928 {
9929 case GL_TEXTURE_2D:
9930 {
9931 gl::Texture2D *texture2d = context->getTexture2D();
9932 texture2d->storage(levels, internalformat, width, height);
9933 }
9934 break;
9935
Geoff Lang01c21d22013-09-24 11:52:16 -04009936 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009937 {
9938 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9939 textureCube->storage(levels, internalformat, width);
9940 }
9941 break;
9942
9943 default:
9944 return gl::error(GL_INVALID_ENUM);
9945 }
9946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009947 }
9948 catch(std::bad_alloc&)
9949 {
9950 return gl::error(GL_OUT_OF_MEMORY);
9951 }
9952}
9953
9954void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9955{
9956 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9957 "GLsizei height = %d, GLsizei depth = %d)",
9958 target, levels, internalformat, width, height, depth);
9959
9960 try
9961 {
9962 gl::Context *context = gl::getNonLostContext();
9963
9964 if (context)
9965 {
9966 if (context->getClientVersion() < 3)
9967 {
9968 return gl::error(GL_INVALID_OPERATION);
9969 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009970
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009971 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009972 {
9973 return;
9974 }
9975
9976 switch (target)
9977 {
9978 case GL_TEXTURE_3D:
9979 {
9980 gl::Texture3D *texture3d = context->getTexture3D();
9981 texture3d->storage(levels, internalformat, width, height, depth);
9982 }
9983 break;
9984
9985 case GL_TEXTURE_2D_ARRAY:
9986 {
9987 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9988 texture2darray->storage(levels, internalformat, width, height, depth);
9989 }
9990 break;
9991
9992 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009993 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009994 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009996 }
9997 catch(std::bad_alloc&)
9998 {
9999 return gl::error(GL_OUT_OF_MEMORY);
10000 }
10001}
10002
10003void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10004{
10005 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10006 "GLint* params = 0x%0.8p)",
10007 target, internalformat, pname, bufSize, params);
10008
10009 try
10010 {
10011 gl::Context *context = gl::getNonLostContext();
10012
10013 if (context)
10014 {
10015 if (context->getClientVersion() < 3)
10016 {
10017 return gl::error(GL_INVALID_OPERATION);
10018 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010019
Shannon Woods809d2502013-07-08 10:32:18 -040010020 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10021 !gl::IsDepthRenderingSupported(internalformat, context) &&
10022 !gl::IsStencilRenderingSupported(internalformat, context))
10023 {
10024 return gl::error(GL_INVALID_ENUM);
10025 }
10026
10027 if (target != GL_RENDERBUFFER)
10028 {
10029 return gl::error(GL_INVALID_ENUM);
10030 }
10031
10032 if (bufSize < 0)
10033 {
10034 return gl::error(GL_INVALID_VALUE);
10035 }
10036
10037 switch (pname)
10038 {
10039 case GL_NUM_SAMPLE_COUNTS:
10040 if (bufSize != 0)
10041 *params = context->getNumSampleCounts(internalformat);
10042 break;
10043 case GL_SAMPLES:
10044 context->getSampleCounts(internalformat, bufSize, params);
10045 break;
10046 default:
10047 return gl::error(GL_INVALID_ENUM);
10048 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010050 }
10051 catch(std::bad_alloc&)
10052 {
10053 return gl::error(GL_OUT_OF_MEMORY);
10054 }
10055}
10056
10057// Extension functions
10058
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010059void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10060 GLbitfield mask, GLenum filter)
10061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010062 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010063 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10064 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10065 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10066
10067 try
10068 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010069 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010070
10071 if (context)
10072 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010073 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010074 dstX0, dstY0, dstX1, dstY1, mask, filter,
10075 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010076 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010077 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010078 }
10079
Geoff Lang758d5b22013-06-11 11:42:50 -040010080 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10081 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010082 }
10083 }
10084 catch(std::bad_alloc&)
10085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010086 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010087 }
10088}
10089
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010090void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10091 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010093 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010094 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010095 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010096 target, level, internalformat, width, height, depth, border, format, type, pixels);
10097
10098 try
10099 {
10100 UNIMPLEMENTED(); // FIXME
10101 }
10102 catch(std::bad_alloc&)
10103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010105 }
10106}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010107
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010108void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10109 GLenum *binaryFormat, void *binary)
10110{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010111 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 +000010112 program, bufSize, length, binaryFormat, binary);
10113
10114 try
10115 {
10116 gl::Context *context = gl::getNonLostContext();
10117
10118 if (context)
10119 {
10120 gl::Program *programObject = context->getProgram(program);
10121
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010122 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010124 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010125 }
10126
10127 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10128
10129 if (!programBinary)
10130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010131 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010132 }
10133
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010134 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010136 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010137 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010138
10139 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010140 }
10141 }
10142 catch(std::bad_alloc&)
10143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010144 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010145 }
10146}
10147
10148void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10149 const void *binary, GLint length)
10150{
10151 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10152 program, binaryFormat, binary, length);
10153
10154 try
10155 {
10156 gl::Context *context = gl::getNonLostContext();
10157
10158 if (context)
10159 {
10160 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010162 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010163 }
10164
10165 gl::Program *programObject = context->getProgram(program);
10166
10167 if (!programObject)
10168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010169 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010170 }
10171
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010172 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010173 }
10174 }
10175 catch(std::bad_alloc&)
10176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010177 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010178 }
10179}
10180
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010181void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10182{
10183 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10184
10185 try
10186 {
10187 gl::Context *context = gl::getNonLostContext();
10188
10189 if (context)
10190 {
10191 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10192 {
10193 return gl::error(GL_INVALID_VALUE);
10194 }
10195
10196 if (context->getDrawFramebufferHandle() == 0)
10197 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010198 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010199 {
10200 return gl::error(GL_INVALID_OPERATION);
10201 }
10202
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010203 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010204 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010205 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010206 }
10207 }
10208 else
10209 {
10210 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10211 {
10212 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10213 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10214 {
10215 return gl::error(GL_INVALID_OPERATION);
10216 }
10217 }
10218 }
10219
10220 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10221
10222 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10223 {
10224 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10225 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010226
10227 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10228 {
10229 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10230 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010231 }
10232 }
10233 catch (std::bad_alloc&)
10234 {
10235 return gl::error(GL_OUT_OF_MEMORY);
10236 }
10237}
10238
Shannon Woodsb3801742014-03-27 14:59:19 -040010239void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
10240{
10241 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
10242
10243 try
10244 {
10245 gl::Context *context = gl::getNonLostContext();
10246
10247 if (context)
10248 {
10249 if (!context->supportsPBOs())
10250 {
10251 return gl::error(GL_INVALID_OPERATION);
10252 }
10253
10254 if (!gl::ValidBufferTarget(context, target))
10255 {
10256 return gl::error(GL_INVALID_ENUM);
10257 }
10258
10259 if (pname != GL_BUFFER_MAP_POINTER)
10260 {
10261 return gl::error(GL_INVALID_ENUM);
10262 }
10263
10264 gl::Buffer *buffer = context->getTargetBuffer(target);
10265
10266 if (!buffer || !buffer->mapped())
10267 {
10268 *params = NULL;
10269 }
10270
10271 *params = buffer->mapPointer();
10272 }
10273 }
10274 catch (std::bad_alloc&)
10275 {
10276 return gl::error(GL_OUT_OF_MEMORY);
10277 }
10278}
10279
10280void * __stdcall glMapBufferOES(GLenum target, GLenum access)
10281{
10282 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
10283
10284 try
10285 {
10286 gl::Context *context = gl::getNonLostContext();
10287
10288 if (context)
10289 {
10290 if (!gl::ValidBufferTarget(context, target))
10291 {
10292 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10293 }
10294
10295 gl::Buffer *buffer = context->getTargetBuffer(target);
10296
10297 if (buffer == NULL)
10298 {
10299 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10300 }
10301
10302 if (access != GL_WRITE_ONLY_OES)
10303 {
10304 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10305 }
10306
10307 if (buffer->mapped())
10308 {
10309 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10310 }
10311
10312 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10313 }
10314 }
10315 catch(std::bad_alloc&)
10316 {
10317 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10318 }
10319
10320 return NULL;
10321}
10322
10323GLboolean __stdcall glUnmapBufferOES(GLenum target)
10324{
10325 EVENT("(GLenum target = 0x%X)", target);
10326
10327 try
10328 {
10329 gl::Context *context = gl::getNonLostContext();
10330
10331 if (context)
10332 {
10333 if (!gl::ValidBufferTarget(context, target))
10334 {
10335 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10336 }
10337
10338 gl::Buffer *buffer = context->getTargetBuffer(target);
10339
10340 if (buffer == NULL || !buffer->mapped())
10341 {
10342 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10343 }
10344
10345 // TODO: detect if we had corruption. if so, throw an error and return false.
10346
10347 buffer->unmap();
10348
10349 return GL_TRUE;
10350 }
10351 }
10352 catch(std::bad_alloc&)
10353 {
10354 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10355 }
10356
10357 return GL_FALSE;
10358}
10359
Shannon Woods916e7692014-03-27 16:58:22 -040010360void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10361{
10362 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10363 target, offset, length, access);
10364
10365 try
10366 {
10367 gl::Context *context = gl::getNonLostContext();
10368
10369 if (context)
10370 {
10371 if (!gl::ValidBufferTarget(context, target))
10372 {
10373 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10374 }
10375
10376 if (offset < 0 || length < 0)
10377 {
10378 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10379 }
10380
10381 gl::Buffer *buffer = context->getTargetBuffer(target);
10382
10383 if (buffer == NULL)
10384 {
10385 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10386 }
10387
10388 // Check for buffer overflow
10389 size_t offsetSize = static_cast<size_t>(offset);
10390 size_t lengthSize = static_cast<size_t>(length);
10391
10392 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10393 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10394 {
10395 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10396 }
10397
10398 // Check for invalid bits in the mask
10399 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10400 GL_MAP_WRITE_BIT |
10401 GL_MAP_INVALIDATE_RANGE_BIT |
10402 GL_MAP_INVALIDATE_BUFFER_BIT |
10403 GL_MAP_FLUSH_EXPLICIT_BIT |
10404 GL_MAP_UNSYNCHRONIZED_BIT;
10405
10406 if (access & ~(allAccessBits))
10407 {
10408 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10409 }
10410
10411 if (length == 0 || buffer->mapped())
10412 {
10413 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10414 }
10415
10416 // Check for invalid bit combinations
10417 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10418 {
10419 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10420 }
10421
10422 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10423 GL_MAP_INVALIDATE_BUFFER_BIT |
10424 GL_MAP_UNSYNCHRONIZED_BIT;
10425
10426 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10427 {
10428 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10429 }
10430
10431 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10432 {
10433 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10434 }
10435
10436 return buffer->mapRange(offset, length, access);
10437 }
10438 }
10439 catch(std::bad_alloc&)
10440 {
10441 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10442 }
10443
10444 return NULL;
10445}
10446
10447void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10448{
10449 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10450
10451 try
10452 {
10453 gl::Context *context = gl::getNonLostContext();
10454
10455 if (context)
10456 {
10457 if (offset < 0 || length < 0)
10458 {
10459 return gl::error(GL_INVALID_VALUE);
10460 }
10461
10462 if (!gl::ValidBufferTarget(context, target))
10463 {
10464 return gl::error(GL_INVALID_ENUM);
10465 }
10466
10467 gl::Buffer *buffer = context->getTargetBuffer(target);
10468
10469 if (buffer == NULL)
10470 {
10471 return gl::error(GL_INVALID_OPERATION);
10472 }
10473
10474 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10475 {
10476 return gl::error(GL_INVALID_OPERATION);
10477 }
10478
10479 // Check for buffer overflow
10480 size_t offsetSize = static_cast<size_t>(offset);
10481 size_t lengthSize = static_cast<size_t>(length);
10482
10483 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10484 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10485 {
10486 return gl::error(GL_INVALID_VALUE);
10487 }
10488
10489 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10490 }
10491 }
10492 catch(std::bad_alloc&)
10493 {
10494 return gl::error(GL_OUT_OF_MEMORY);
10495 }
10496}
10497
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010498__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10499{
10500 struct Extension
10501 {
10502 const char *name;
10503 __eglMustCastToProperFunctionPointerType address;
10504 };
10505
10506 static const Extension glExtensions[] =
10507 {
10508 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010509 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010510 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010511 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10512 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10513 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10514 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10515 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10516 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10517 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010518 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010519 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010520 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10521 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10522 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10523 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010524 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10525 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10526 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10527 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10528 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10529 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10530 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010531 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010532 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10533 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10534 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010535 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010536 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10537 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10538 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010539 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10540 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10541 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010542
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010543 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010544 {
10545 if (strcmp(procname, glExtensions[ext].name) == 0)
10546 {
10547 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10548 }
10549 }
10550
10551 return NULL;
10552}
10553
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010554// Non-public functions used by EGL
10555
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010556bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010557{
10558 EVENT("(egl::Surface* surface = 0x%0.8p)",
10559 surface);
10560
10561 try
10562 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010563 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010564
10565 if (context)
10566 {
10567 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010568 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010569
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010570 if (textureObject->isImmutable())
10571 {
10572 return false;
10573 }
10574
Geoff Lang32d508e2014-02-11 09:39:48 -050010575 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010576 }
10577 }
10578 catch(std::bad_alloc&)
10579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010580 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010581 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010582
10583 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010584}
10585
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010586}