blob: e2b4f65aadc3976d197080eb8e54ef9e2b0160b7 [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;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003549 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003551 }
3552 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553 }
3554 catch(std::bad_alloc&)
3555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003556 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003557 }
3558}
3559
3560void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003562 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 +00003563
3564 try
3565 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003567
3568 if (context)
3569 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003570 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003571
Jamie Madillfb8a8302013-07-03 14:24:12 -04003572 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003575 }
3576
3577 switch (pname)
3578 {
3579 case GL_TEXTURE_MAG_FILTER:
3580 *params = texture->getMagFilter();
3581 break;
3582 case GL_TEXTURE_MIN_FILTER:
3583 *params = texture->getMinFilter();
3584 break;
3585 case GL_TEXTURE_WRAP_S:
3586 *params = texture->getWrapS();
3587 break;
3588 case GL_TEXTURE_WRAP_T:
3589 *params = texture->getWrapT();
3590 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003591 case GL_TEXTURE_WRAP_R:
3592 if (context->getClientVersion() < 3)
3593 {
3594 return gl::error(GL_INVALID_ENUM);
3595 }
3596 *params = texture->getWrapR();
3597 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003598 case GL_TEXTURE_IMMUTABLE_FORMAT:
3599 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003600 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3601 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003602 case GL_TEXTURE_IMMUTABLE_LEVELS:
3603 if (context->getClientVersion() < 3)
3604 {
3605 return gl::error(GL_INVALID_ENUM);
3606 }
Jamie Madill51a94372013-10-24 17:49:43 -04003607 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003608 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003609 case GL_TEXTURE_USAGE_ANGLE:
3610 *params = texture->getUsage();
3611 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003612 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3613 if (!context->supportsTextureFilterAnisotropy())
3614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003615 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003616 }
3617 *params = (GLint)texture->getMaxAnisotropy();
3618 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003619 case GL_TEXTURE_SWIZZLE_R:
3620 if (context->getClientVersion() < 3)
3621 {
3622 return gl::error(GL_INVALID_ENUM);
3623 }
3624 *params = texture->getSwizzleRed();
3625 break;
3626 case GL_TEXTURE_SWIZZLE_G:
3627 if (context->getClientVersion() < 3)
3628 {
3629 return gl::error(GL_INVALID_ENUM);
3630 }
3631 *params = texture->getSwizzleGreen();
3632 break;
3633 case GL_TEXTURE_SWIZZLE_B:
3634 if (context->getClientVersion() < 3)
3635 {
3636 return gl::error(GL_INVALID_ENUM);
3637 }
3638 *params = texture->getSwizzleBlue();
3639 break;
3640 case GL_TEXTURE_SWIZZLE_A:
3641 if (context->getClientVersion() < 3)
3642 {
3643 return gl::error(GL_INVALID_ENUM);
3644 }
3645 *params = texture->getSwizzleAlpha();
3646 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003647
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003648 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003650 }
3651 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003652 }
3653 catch(std::bad_alloc&)
3654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003656 }
3657}
3658
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003659void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3660{
3661 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3662 program, location, bufSize, params);
3663
3664 try
3665 {
3666 if (bufSize < 0)
3667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003669 }
3670
3671 gl::Context *context = gl::getNonLostContext();
3672
3673 if (context)
3674 {
3675 if (program == 0)
3676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003678 }
3679
3680 gl::Program *programObject = context->getProgram(program);
3681
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003682 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003685 }
3686
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003687 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3688 if (!programBinary)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003691 }
3692
3693 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003696 }
3697 }
3698 }
3699 catch(std::bad_alloc&)
3700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003702 }
3703}
3704
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3706{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003707 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003708
3709 try
3710 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003711 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003712
3713 if (context)
3714 {
3715 if (program == 0)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003718 }
3719
3720 gl::Program *programObject = context->getProgram(program);
3721
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003722 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003725 }
3726
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003727 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3728 if (!programBinary)
3729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003730 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003731 }
3732
3733 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003736 }
3737 }
3738 }
3739 catch(std::bad_alloc&)
3740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003742 }
3743}
3744
3745void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3746{
3747 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3748 program, location, bufSize, params);
3749
3750 try
3751 {
3752 if (bufSize < 0)
3753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003754 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003755 }
3756
3757 gl::Context *context = gl::getNonLostContext();
3758
3759 if (context)
3760 {
3761 if (program == 0)
3762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003764 }
3765
3766 gl::Program *programObject = context->getProgram(program);
3767
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003768 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003770 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003771 }
3772
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003773 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3774 if (!programBinary)
3775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003776 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003777 }
3778
3779 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003782 }
3783 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784 }
3785 catch(std::bad_alloc&)
3786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003788 }
3789}
3790
3791void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003793 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794
3795 try
3796 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003797 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003798
3799 if (context)
3800 {
3801 if (program == 0)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003804 }
3805
3806 gl::Program *programObject = context->getProgram(program);
3807
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003808 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003811 }
3812
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003813 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3814 if (!programBinary)
3815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003816 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003817 }
3818
3819 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003822 }
3823 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824 }
3825 catch(std::bad_alloc&)
3826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003828 }
3829}
3830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003831int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003833 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834
3835 try
3836 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003838
3839 if (strstr(name, "gl_") == name)
3840 {
3841 return -1;
3842 }
3843
3844 if (context)
3845 {
3846 gl::Program *programObject = context->getProgram(program);
3847
3848 if (!programObject)
3849 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003850 if (context->getShader(program))
3851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003852 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003853 }
3854 else
3855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003856 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003857 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858 }
3859
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003860 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003861 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003864 }
3865
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003866 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 }
3868 }
3869 catch(std::bad_alloc&)
3870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872 }
3873
3874 return -1;
3875}
3876
3877void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003879 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880
3881 try
3882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003884
daniel@transgaming.come0078962010-04-15 20:45:08 +00003885 if (context)
3886 {
3887 if (index >= gl::MAX_VERTEX_ATTRIBS)
3888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003890 }
3891
daniel@transgaming.com83921382011-01-08 05:46:00 +00003892 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003893
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003894 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003895 {
Jamie Madillaff71502013-07-02 11:57:05 -04003896 return;
3897 }
3898
3899 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3900 {
3901 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3902 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003903 {
Jamie Madillaff71502013-07-02 11:57:05 -04003904 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 }
Jamie Madillaff71502013-07-02 11:57:05 -04003906 }
3907 else
3908 {
3909 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003910 }
3911 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912 }
3913 catch(std::bad_alloc&)
3914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003915 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916 }
3917}
3918
3919void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3920{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003921 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922
3923 try
3924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926
daniel@transgaming.come0078962010-04-15 20:45:08 +00003927 if (context)
3928 {
3929 if (index >= gl::MAX_VERTEX_ATTRIBS)
3930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003932 }
3933
daniel@transgaming.com83921382011-01-08 05:46:00 +00003934 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003935
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003936 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003937 {
Jamie Madillaff71502013-07-02 11:57:05 -04003938 return;
3939 }
3940
3941 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3942 {
3943 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3944 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003945 {
Jamie Madillaff71502013-07-02 11:57:05 -04003946 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003947 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003948 }
Jamie Madillaff71502013-07-02 11:57:05 -04003949 }
3950 else
3951 {
3952 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003953 }
3954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003955 }
3956 catch(std::bad_alloc&)
3957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 }
3960}
3961
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003962void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003964 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965
3966 try
3967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003969
daniel@transgaming.come0078962010-04-15 20:45:08 +00003970 if (context)
3971 {
3972 if (index >= gl::MAX_VERTEX_ATTRIBS)
3973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003975 }
3976
3977 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003979 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003980 }
3981
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003982 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984 }
3985 catch(std::bad_alloc&)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988 }
3989}
3990
3991void __stdcall glHint(GLenum target, GLenum mode)
3992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003993 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994
3995 try
3996 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003997 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003998 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003999 case GL_FASTEST:
4000 case GL_NICEST:
4001 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004002 break;
4003 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004005 }
4006
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004007 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004008 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004009 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004010 case GL_GENERATE_MIPMAP_HINT:
4011 if (context) context->setGenerateMipmapHint(mode);
4012 break;
4013 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4014 if (context) context->setFragmentShaderDerivativeHint(mode);
4015 break;
4016 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 }
4020 catch(std::bad_alloc&)
4021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 }
4024}
4025
4026GLboolean __stdcall glIsBuffer(GLuint buffer)
4027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004028 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029
4030 try
4031 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033
4034 if (context && buffer)
4035 {
4036 gl::Buffer *bufferObject = context->getBuffer(buffer);
4037
4038 if (bufferObject)
4039 {
4040 return GL_TRUE;
4041 }
4042 }
4043 }
4044 catch(std::bad_alloc&)
4045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047 }
4048
4049 return GL_FALSE;
4050}
4051
4052GLboolean __stdcall glIsEnabled(GLenum cap)
4053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004054 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055
4056 try
4057 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059
4060 if (context)
4061 {
Geoff Lang0550d032014-01-30 11:29:07 -05004062 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004064 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065 }
Geoff Lang0550d032014-01-30 11:29:07 -05004066
4067 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068 }
4069 }
4070 catch(std::bad_alloc&)
4071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073 }
4074
4075 return false;
4076}
4077
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004078GLboolean __stdcall glIsFenceNV(GLuint fence)
4079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004080 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004081
4082 try
4083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004084 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004085
4086 if (context)
4087 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004088 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004089
4090 if (fenceObject == NULL)
4091 {
4092 return GL_FALSE;
4093 }
4094
4095 return fenceObject->isFence();
4096 }
4097 }
4098 catch(std::bad_alloc&)
4099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004100 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004101 }
4102
4103 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004104}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004108 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004109
4110 try
4111 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004112 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113
4114 if (context && framebuffer)
4115 {
4116 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4117
4118 if (framebufferObject)
4119 {
4120 return GL_TRUE;
4121 }
4122 }
4123 }
4124 catch(std::bad_alloc&)
4125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004126 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127 }
4128
4129 return GL_FALSE;
4130}
4131
4132GLboolean __stdcall glIsProgram(GLuint program)
4133{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004134 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004135
4136 try
4137 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004138 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004139
4140 if (context && program)
4141 {
4142 gl::Program *programObject = context->getProgram(program);
4143
4144 if (programObject)
4145 {
4146 return GL_TRUE;
4147 }
4148 }
4149 }
4150 catch(std::bad_alloc&)
4151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004152 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153 }
4154
4155 return GL_FALSE;
4156}
4157
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004158GLboolean __stdcall glIsQueryEXT(GLuint id)
4159{
4160 EVENT("(GLuint id = %d)", id);
4161
4162 try
4163 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004164 gl::Context *context = gl::getNonLostContext();
4165
4166 if (context)
4167 {
Geoff Lang37dde692014-01-31 16:34:54 -05004168 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004169 }
4170 }
4171 catch(std::bad_alloc&)
4172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004174 }
4175
4176 return GL_FALSE;
4177}
4178
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004181 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182
4183 try
4184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004186
4187 if (context && renderbuffer)
4188 {
4189 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4190
4191 if (renderbufferObject)
4192 {
4193 return GL_TRUE;
4194 }
4195 }
4196 }
4197 catch(std::bad_alloc&)
4198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201
4202 return GL_FALSE;
4203}
4204
4205GLboolean __stdcall glIsShader(GLuint shader)
4206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004207 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208
4209 try
4210 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 if (context && shader)
4214 {
4215 gl::Shader *shaderObject = context->getShader(shader);
4216
4217 if (shaderObject)
4218 {
4219 return GL_TRUE;
4220 }
4221 }
4222 }
4223 catch(std::bad_alloc&)
4224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004225 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226 }
4227
4228 return GL_FALSE;
4229}
4230
4231GLboolean __stdcall glIsTexture(GLuint texture)
4232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004233 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004234
4235 try
4236 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238
4239 if (context && texture)
4240 {
4241 gl::Texture *textureObject = context->getTexture(texture);
4242
4243 if (textureObject)
4244 {
4245 return GL_TRUE;
4246 }
4247 }
4248 }
4249 catch(std::bad_alloc&)
4250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004251 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 }
4253
4254 return GL_FALSE;
4255}
4256
4257void __stdcall glLineWidth(GLfloat width)
4258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004259 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260
4261 try
4262 {
4263 if (width <= 0.0f)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004268 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004269
4270 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004271 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004272 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 }
4274 }
4275 catch(std::bad_alloc&)
4276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278 }
4279}
4280
4281void __stdcall glLinkProgram(GLuint program)
4282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004283 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004284
4285 try
4286 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288
4289 if (context)
4290 {
4291 gl::Program *programObject = context->getProgram(program);
4292
4293 if (!programObject)
4294 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004295 if (context->getShader(program))
4296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004297 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004298 }
4299 else
4300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004301 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303 }
4304
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004305 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 }
4307 }
4308 catch(std::bad_alloc&)
4309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311 }
4312}
4313
4314void __stdcall glPixelStorei(GLenum pname, GLint param)
4315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004316 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004317
4318 try
4319 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004321
4322 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004324 switch (pname)
4325 {
4326 case GL_UNPACK_ALIGNMENT:
4327 if (param != 1 && param != 2 && param != 4 && param != 8)
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004330 }
4331
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004332 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004333 break;
4334
4335 case GL_PACK_ALIGNMENT:
4336 if (param != 1 && param != 2 && param != 4 && param != 8)
4337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004338 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004339 }
4340
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004341 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004342 break;
4343
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004344 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4345 context->setPackReverseRowOrder(param != 0);
4346 break;
4347
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004348 case GL_UNPACK_IMAGE_HEIGHT:
4349 case GL_UNPACK_SKIP_IMAGES:
4350 case GL_UNPACK_ROW_LENGTH:
4351 case GL_UNPACK_SKIP_ROWS:
4352 case GL_UNPACK_SKIP_PIXELS:
4353 case GL_PACK_ROW_LENGTH:
4354 case GL_PACK_SKIP_ROWS:
4355 case GL_PACK_SKIP_PIXELS:
4356 if (context->getClientVersion() < 3)
4357 {
4358 return gl::error(GL_INVALID_ENUM);
4359 }
4360 UNIMPLEMENTED();
4361 break;
4362
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004363 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004365 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
4367 }
4368 catch(std::bad_alloc&)
4369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 }
4372}
4373
4374void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004376 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377
4378 try
4379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004381
4382 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004384 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385 }
4386 }
4387 catch(std::bad_alloc&)
4388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004389 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004390 }
4391}
4392
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004393void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4394 GLenum format, GLenum type, GLsizei bufSize,
4395 GLvoid *data)
4396{
4397 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4398 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4399 x, y, width, height, format, type, bufSize, data);
4400
4401 try
4402 {
4403 if (width < 0 || height < 0 || bufSize < 0)
4404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004406 }
4407
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004408 gl::Context *context = gl::getNonLostContext();
4409
4410 if (context)
4411 {
Jamie Madill26e91952014-03-05 15:01:27 -05004412 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4413 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004414 {
Jamie Madill26e91952014-03-05 15:01:27 -05004415 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004416 }
4417
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004418 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4419 }
4420 }
4421 catch(std::bad_alloc&)
4422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004424 }
4425}
4426
4427void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4428 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004430 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004431 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004432 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 try
4435 {
4436 if (width < 0 || height < 0)
4437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439 }
4440
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
4443 if (context)
4444 {
Jamie Madill26e91952014-03-05 15:01:27 -05004445 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4446 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004447 {
Jamie Madill26e91952014-03-05 15:01:27 -05004448 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004449 }
4450
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004451 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452 }
4453 }
4454 catch(std::bad_alloc&)
4455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004457 }
4458}
4459
4460void __stdcall glReleaseShaderCompiler(void)
4461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004462 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463
4464 try
4465 {
4466 gl::Shader::releaseCompiler();
4467 }
4468 catch(std::bad_alloc&)
4469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 }
4472}
4473
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004474void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004476 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 +00004477 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004478
4479 try
4480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482
4483 if (context)
4484 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004485 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004486 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004487 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004488 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004490
4491 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492 }
4493 }
4494 catch(std::bad_alloc&)
4495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497 }
4498}
4499
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004500void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4501{
4502 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4503}
4504
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4506{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004507 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508
4509 try
4510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004511 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004512
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513 if (context)
4514 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004515 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
4517 }
4518 catch(std::bad_alloc&)
4519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521 }
4522}
4523
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004524void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004527
4528 try
4529 {
4530 if (condition != GL_ALL_COMPLETED_NV)
4531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004532 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004533 }
4534
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004535 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004536
4537 if (context)
4538 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004539 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004540
4541 if (fenceObject == NULL)
4542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004543 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004544 }
4545
4546 fenceObject->setFence(condition);
4547 }
4548 }
4549 catch(std::bad_alloc&)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004552 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004553}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004554
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004557 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 +00004558
4559 try
4560 {
4561 if (width < 0 || height < 0)
4562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 }
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.com428d1582010-05-04 03:35:25 +00004570 context->setScissorParams(x, y, width, height);
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.comfe4b8272010-04-08 03:51:20 +00004579void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004581 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004582 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004583 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584
4585 try
4586 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004587 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004589 }
4590 catch(std::bad_alloc&)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594}
4595
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004596void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004598 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 +00004599 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 try
4602 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004603 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606 }
4607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609
4610 if (context)
4611 {
4612 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004613
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 if (!shaderObject)
4615 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004616 if (context->getProgram(shader))
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004619 }
4620 else
4621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004623 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
4625
4626 shaderObject->setSource(count, string, length);
4627 }
4628 }
4629 catch(std::bad_alloc&)
4630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004631 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633}
4634
4635void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4636{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004637 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638}
4639
4640void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004642 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 +00004643
4644 try
4645 {
4646 switch (face)
4647 {
4648 case GL_FRONT:
4649 case GL_BACK:
4650 case GL_FRONT_AND_BACK:
4651 break;
4652 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655
4656 switch (func)
4657 {
4658 case GL_NEVER:
4659 case GL_ALWAYS:
4660 case GL_LESS:
4661 case GL_LEQUAL:
4662 case GL_EQUAL:
4663 case GL_GEQUAL:
4664 case GL_GREATER:
4665 case GL_NOTEQUAL:
4666 break;
4667 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 }
4670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004671 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672
4673 if (context)
4674 {
4675 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4676 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004677 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 }
4679
4680 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4681 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004682 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683 }
4684 }
4685 }
4686 catch(std::bad_alloc&)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690}
4691
4692void __stdcall glStencilMask(GLuint mask)
4693{
4694 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4695}
4696
4697void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4698{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004699 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700
4701 try
4702 {
4703 switch (face)
4704 {
4705 case GL_FRONT:
4706 case GL_BACK:
4707 case GL_FRONT_AND_BACK:
4708 break;
4709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714
4715 if (context)
4716 {
4717 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4718 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004719 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 }
4721
4722 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4723 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004724 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725 }
4726 }
4727 }
4728 catch(std::bad_alloc&)
4729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731 }
4732}
4733
4734void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4735{
4736 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4737}
4738
4739void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004741 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 +00004742 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743
4744 try
4745 {
4746 switch (face)
4747 {
4748 case GL_FRONT:
4749 case GL_BACK:
4750 case GL_FRONT_AND_BACK:
4751 break;
4752 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 }
4755
4756 switch (fail)
4757 {
4758 case GL_ZERO:
4759 case GL_KEEP:
4760 case GL_REPLACE:
4761 case GL_INCR:
4762 case GL_DECR:
4763 case GL_INVERT:
4764 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004765 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 break;
4767 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770
4771 switch (zfail)
4772 {
4773 case GL_ZERO:
4774 case GL_KEEP:
4775 case GL_REPLACE:
4776 case GL_INCR:
4777 case GL_DECR:
4778 case GL_INVERT:
4779 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004780 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 break;
4782 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 }
4785
4786 switch (zpass)
4787 {
4788 case GL_ZERO:
4789 case GL_KEEP:
4790 case GL_REPLACE:
4791 case GL_INCR:
4792 case GL_DECR:
4793 case GL_INVERT:
4794 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004795 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796 break;
4797 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004798 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 }
4800
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
4803 if (context)
4804 {
4805 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4806 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004807 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 }
4809
4810 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4811 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004812 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814 }
4815 }
4816 catch(std::bad_alloc&)
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819 }
4820}
4821
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004822GLboolean __stdcall glTestFenceNV(GLuint fence)
4823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004824 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004825
4826 try
4827 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004828 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004829
4830 if (context)
4831 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004832 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004833
4834 if (fenceObject == NULL)
4835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004836 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004837 }
4838
Jamie Madillfb9a7402013-07-26 11:55:01 -04004839 if (fenceObject->isFence() != GL_TRUE)
4840 {
4841 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4842 }
4843
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004844 return fenceObject->testFence();
4845 }
4846 }
4847 catch(std::bad_alloc&)
4848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004849 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004850 }
4851
4852 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004853}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004854
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004855void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4856 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004858 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004859 "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 +00004860 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861
4862 try
4863 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 if (context)
4867 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004868 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004869 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004870 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004871 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004872 return;
4873 }
4874
4875 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004876 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004877 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004878 {
4879 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004880 }
4881
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004882 switch (target)
4883 {
4884 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004885 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004886 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004887 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004888 }
4889 break;
4890 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004891 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004892 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004893 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004895 break;
4896 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4897 {
4898 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004899 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004900 }
4901 break;
4902 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4903 {
4904 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004905 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004906 }
4907 break;
4908 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4909 {
4910 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004911 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004912 }
4913 break;
4914 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4915 {
4916 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004917 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004918 }
4919 break;
4920 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4921 {
4922 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004923 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004924 }
4925 break;
4926 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004927 }
4928 }
4929 }
4930 catch(std::bad_alloc&)
4931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933 }
4934}
4935
4936void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4937{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004938 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4939
4940 try
4941 {
4942 gl::Context *context = gl::getNonLostContext();
4943
4944 if (context)
4945 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004946 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004947 {
4948 return;
4949 }
4950
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004951 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004952
Jamie Madillfb8a8302013-07-03 14:24:12 -04004953 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004955 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004956 }
4957
4958 switch (pname)
4959 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004960 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4961 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4962 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4963 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4964 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4965 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4966 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4967 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4968 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004969 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4970 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4971 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4972 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004973
Jamie Madill478fdb22013-07-19 16:36:59 -04004974 case GL_TEXTURE_BASE_LEVEL:
4975 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004976 case GL_TEXTURE_MIN_LOD:
4977 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004978 UNIMPLEMENTED();
4979 break;
4980
Jamie Madill478fdb22013-07-19 16:36:59 -04004981 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +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.com07ab8412012-07-12 15:17:09 +00004988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989}
4990
4991void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4992{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004993 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994}
4995
4996void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004998 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999
5000 try
5001 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005003
5004 if (context)
5005 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005006 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005007 {
5008 return;
5009 }
5010
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005011 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012
Jamie Madillfb8a8302013-07-03 14:24:12 -04005013 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 }
5017
5018 switch (pname)
5019 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005020 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5021 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5022 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5023 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5024 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5025 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5026 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5027 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5028 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005029 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5030 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5031 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5032 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005033
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005034 case GL_TEXTURE_BASE_LEVEL:
5035 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005036 case GL_TEXTURE_MIN_LOD:
5037 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005038 UNIMPLEMENTED();
5039 break;
5040
Jamie Madill478fdb22013-07-19 16:36:59 -04005041 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043 }
5044 }
5045 catch(std::bad_alloc&)
5046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005047 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005048 }
5049}
5050
5051void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5052{
5053 glTexParameteri(target, pname, *params);
5054}
5055
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005056void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5057{
5058 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5059 target, levels, internalformat, width, height);
5060
5061 try
5062 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005063 gl::Context *context = gl::getNonLostContext();
5064
5065 if (context)
5066 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005067 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005068 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005069 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005070 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005071 }
5072
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005073 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005074 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005075 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005076 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005077 }
5078
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005079 switch (target)
5080 {
5081 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005082 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005083 gl::Texture2D *texture2d = context->getTexture2D();
5084 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005085 }
5086 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005087
Geoff Lang01c21d22013-09-24 11:52:16 -04005088 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005089 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005090 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5091 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005092 }
5093 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005094
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005095 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005097 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005098 }
5099 }
5100 catch(std::bad_alloc&)
5101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005103 }
5104}
5105
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005106void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5107 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005109 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005110 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005111 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005112 target, level, xoffset, yoffset, width, height, format, type, pixels);
5113
5114 try
5115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005117
5118 if (context)
5119 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005120 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005121 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005122 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005123 {
5124 return;
5125 }
5126
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005127 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005128 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005129 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005130 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005131 return;
5132 }
5133
5134 switch (target)
5135 {
5136 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005137 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005138 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005139 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005140 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005141 break;
5142
5143 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5144 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5145 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5146 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5147 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5148 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005149 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005150 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005151 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005152 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005153 break;
5154
5155 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005156 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005157 }
5158 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159 }
5160 catch(std::bad_alloc&)
5161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163 }
5164}
5165
5166void __stdcall glUniform1f(GLint location, GLfloat x)
5167{
5168 glUniform1fv(location, 1, &x);
5169}
5170
5171void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005173 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174
5175 try
5176 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177 if (count < 0)
5178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005182 if (location == -1)
5183 {
5184 return;
5185 }
5186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188
5189 if (context)
5190 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005191 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005192 if (!programBinary)
5193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005195 }
5196
5197 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200 }
5201 }
5202 }
5203 catch(std::bad_alloc&)
5204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206 }
5207}
5208
5209void __stdcall glUniform1i(GLint location, GLint x)
5210{
5211 glUniform1iv(location, 1, &x);
5212}
5213
5214void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005216 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217
5218 try
5219 {
5220 if (count < 0)
5221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223 }
5224
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005225 if (location == -1)
5226 {
5227 return;
5228 }
5229
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231
5232 if (context)
5233 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005234 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005235 if (!programBinary)
5236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005237 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005238 }
5239
5240 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005242 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243 }
5244 }
5245 }
5246 catch(std::bad_alloc&)
5247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005249 }
5250}
5251
5252void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5253{
5254 GLfloat xy[2] = {x, y};
5255
5256 glUniform2fv(location, 1, (GLfloat*)&xy);
5257}
5258
5259void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005261 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262
5263 try
5264 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 if (count < 0)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005269
5270 if (location == -1)
5271 {
5272 return;
5273 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 if (context)
5278 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005279 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005280 if (!programBinary)
5281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005282 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005283 }
5284
5285 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005287 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 }
5289 }
5290 }
5291 catch(std::bad_alloc&)
5292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005294 }
5295}
5296
5297void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5298{
5299 GLint xy[4] = {x, y};
5300
5301 glUniform2iv(location, 1, (GLint*)&xy);
5302}
5303
5304void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005306 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 try
5309 {
5310 if (count < 0)
5311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005312 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005315 if (location == -1)
5316 {
5317 return;
5318 }
5319
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005321
5322 if (context)
5323 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005324 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005325 if (!programBinary)
5326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005327 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005328 }
5329
5330 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005333 }
5334 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336 catch(std::bad_alloc&)
5337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 }
5340}
5341
5342void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5343{
5344 GLfloat xyz[3] = {x, y, z};
5345
5346 glUniform3fv(location, 1, (GLfloat*)&xyz);
5347}
5348
5349void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005351 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352
5353 try
5354 {
5355 if (count < 0)
5356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358 }
5359
5360 if (location == -1)
5361 {
5362 return;
5363 }
5364
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366
5367 if (context)
5368 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005369 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005370 if (!programBinary)
5371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005372 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005373 }
5374
5375 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005377 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378 }
5379 }
5380 }
5381 catch(std::bad_alloc&)
5382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005384 }
5385}
5386
5387void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5388{
5389 GLint xyz[3] = {x, y, z};
5390
5391 glUniform3iv(location, 1, (GLint*)&xyz);
5392}
5393
5394void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005396 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397
5398 try
5399 {
5400 if (count < 0)
5401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005402 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403 }
5404
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005405 if (location == -1)
5406 {
5407 return;
5408 }
5409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005411
5412 if (context)
5413 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005414 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005415 if (!programBinary)
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005418 }
5419
5420 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005423 }
5424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426 catch(std::bad_alloc&)
5427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429 }
5430}
5431
5432void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5433{
5434 GLfloat xyzw[4] = {x, y, z, w};
5435
5436 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5437}
5438
5439void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005441 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442
5443 try
5444 {
5445 if (count < 0)
5446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449
5450 if (location == -1)
5451 {
5452 return;
5453 }
5454
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456
5457 if (context)
5458 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005459 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005460 if (!programBinary)
5461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005462 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005463 }
5464
5465 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 }
5469 }
5470 }
5471 catch(std::bad_alloc&)
5472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474 }
5475}
5476
5477void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5478{
5479 GLint xyzw[4] = {x, y, z, w};
5480
5481 glUniform4iv(location, 1, (GLint*)&xyzw);
5482}
5483
5484void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5485{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005486 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487
5488 try
5489 {
5490 if (count < 0)
5491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493 }
5494
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005495 if (location == -1)
5496 {
5497 return;
5498 }
5499
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005501
5502 if (context)
5503 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005504 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005505 if (!programBinary)
5506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005508 }
5509
5510 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005513 }
5514 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
5516 catch(std::bad_alloc&)
5517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 }
5520}
5521
5522void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5523{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005524 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005525 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526
5527 try
5528 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005529 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
5533
5534 if (location == -1)
5535 {
5536 return;
5537 }
5538
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540
5541 if (context)
5542 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005543 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5544 {
5545 return gl::error(GL_INVALID_VALUE);
5546 }
5547
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005548 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005549 if (!programBinary)
5550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005551 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005552 }
5553
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005554 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 }
5558 }
5559 }
5560 catch(std::bad_alloc&)
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564}
5565
5566void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5567{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005568 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005569 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570
5571 try
5572 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005573 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576 }
5577
5578 if (location == -1)
5579 {
5580 return;
5581 }
5582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
5585 if (context)
5586 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005587 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5588 {
5589 return gl::error(GL_INVALID_VALUE);
5590 }
5591
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005592 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005593 if (!programBinary)
5594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005595 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005596 }
5597
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005598 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 }
5602 }
5603 }
5604 catch(std::bad_alloc&)
5605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005606 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 }
5608}
5609
5610void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5611{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005612 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005613 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614
5615 try
5616 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005617 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 }
5621
5622 if (location == -1)
5623 {
5624 return;
5625 }
5626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628
5629 if (context)
5630 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005631 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5632 {
5633 return gl::error(GL_INVALID_VALUE);
5634 }
5635
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005636 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005637 if (!programBinary)
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005640 }
5641
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005642 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 }
5646 }
5647 }
5648 catch(std::bad_alloc&)
5649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 }
5652}
5653
5654void __stdcall glUseProgram(GLuint program)
5655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005656 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657
5658 try
5659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 if (context)
5663 {
5664 gl::Program *programObject = context->getProgram(program);
5665
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005666 if (!programObject && program != 0)
5667 {
5668 if (context->getShader(program))
5669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005671 }
5672 else
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005675 }
5676 }
5677
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005678 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005681 }
5682
5683 context->useProgram(program);
5684 }
5685 }
5686 catch(std::bad_alloc&)
5687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689 }
5690}
5691
5692void __stdcall glValidateProgram(GLuint program)
5693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005694 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695
5696 try
5697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005699
5700 if (context)
5701 {
5702 gl::Program *programObject = context->getProgram(program);
5703
5704 if (!programObject)
5705 {
5706 if (context->getShader(program))
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005709 }
5710 else
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005713 }
5714 }
5715
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005716 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005717 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719 catch(std::bad_alloc&)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723}
5724
5725void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005727 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728
5729 try
5730 {
5731 if (index >= gl::MAX_VERTEX_ATTRIBS)
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
5735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005737
5738 if (context)
5739 {
5740 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005741 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005742 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 }
5744 catch(std::bad_alloc&)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748}
5749
5750void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005752 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753
5754 try
5755 {
5756 if (index >= gl::MAX_VERTEX_ATTRIBS)
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 }
5760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005762
5763 if (context)
5764 {
5765 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005766 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005767 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005768 }
5769 catch(std::bad_alloc&)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773}
5774
5775void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005777 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778
5779 try
5780 {
5781 if (index >= gl::MAX_VERTEX_ATTRIBS)
5782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005784 }
5785
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005787
5788 if (context)
5789 {
5790 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005791 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005792 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794 catch(std::bad_alloc&)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798}
5799
5800void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005802 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803
5804 try
5805 {
5806 if (index >= gl::MAX_VERTEX_ATTRIBS)
5807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809 }
5810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005812
5813 if (context)
5814 {
5815 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005816 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005817 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819 catch(std::bad_alloc&)
5820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823}
5824
5825void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005827 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 +00005828
5829 try
5830 {
5831 if (index >= gl::MAX_VERTEX_ATTRIBS)
5832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834 }
5835
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005837
5838 if (context)
5839 {
5840 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005841 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005842 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 }
5844 catch(std::bad_alloc&)
5845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848}
5849
5850void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005852 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853
5854 try
5855 {
5856 if (index >= gl::MAX_VERTEX_ATTRIBS)
5857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 }
5860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005862
5863 if (context)
5864 {
5865 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005866 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005867 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 }
5869 catch(std::bad_alloc&)
5870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873}
5874
5875void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005877 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 +00005878
5879 try
5880 {
5881 if (index >= gl::MAX_VERTEX_ATTRIBS)
5882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005887
5888 if (context)
5889 {
5890 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005891 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005893 }
5894 catch(std::bad_alloc&)
5895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898}
5899
5900void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005902 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005903
5904 try
5905 {
5906 if (index >= gl::MAX_VERTEX_ATTRIBS)
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
5910
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005912
5913 if (context)
5914 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005915 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005917 }
5918 catch(std::bad_alloc&)
5919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921 }
5922}
5923
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005924void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5925{
5926 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5927
5928 try
5929 {
5930 if (index >= gl::MAX_VERTEX_ATTRIBS)
5931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005932 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005933 }
5934
5935 gl::Context *context = gl::getNonLostContext();
5936
5937 if (context)
5938 {
5939 context->setVertexAttribDivisor(index, divisor);
5940 }
5941 }
5942 catch(std::bad_alloc&)
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005945 }
5946}
5947
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005948void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005950 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005951 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005952 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953
5954 try
5955 {
5956 if (index >= gl::MAX_VERTEX_ATTRIBS)
5957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959 }
5960
5961 if (size < 1 || size > 4)
5962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005963 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005966 gl::Context *context = gl::getNonLostContext();
5967
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 switch (type)
5969 {
5970 case GL_BYTE:
5971 case GL_UNSIGNED_BYTE:
5972 case GL_SHORT:
5973 case GL_UNSIGNED_SHORT:
5974 case GL_FIXED:
5975 case GL_FLOAT:
5976 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005977 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005978 case GL_INT:
5979 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005980 case GL_INT_2_10_10_10_REV:
5981 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005982 if (context && context->getClientVersion() < 3)
5983 {
5984 return gl::error(GL_INVALID_ENUM);
5985 }
5986 else
5987 {
5988 break;
5989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992 }
5993
5994 if (stride < 0)
5995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005999 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6000 {
6001 return gl::error(GL_INVALID_OPERATION);
6002 }
6003
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004 if (context)
6005 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006006 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6007 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6008 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6009 // and the pointer argument is not NULL.
6010 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6011 {
6012 return gl::error(GL_INVALID_OPERATION);
6013 }
6014
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006015 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6016 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006017 }
6018 }
6019 catch(std::bad_alloc&)
6020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023}
6024
6025void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6026{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006027 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 +00006028
6029 try
6030 {
6031 if (width < 0 || height < 0)
6032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006034 }
6035
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037
6038 if (context)
6039 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006040 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041 }
6042 }
6043 catch(std::bad_alloc&)
6044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006045 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046 }
6047}
6048
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006049// OpenGL ES 3.0 functions
6050
6051void __stdcall glReadBuffer(GLenum mode)
6052{
6053 EVENT("(GLenum mode = 0x%X)", mode);
6054
6055 try
6056 {
6057 gl::Context *context = gl::getNonLostContext();
6058
6059 if (context)
6060 {
6061 if (context->getClientVersion() < 3)
6062 {
6063 return gl::error(GL_INVALID_OPERATION);
6064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006065
Jamie Madill54133512013-06-21 09:33:07 -04006066 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006067 UNIMPLEMENTED();
6068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006069 }
6070 catch(std::bad_alloc&)
6071 {
6072 return gl::error(GL_OUT_OF_MEMORY);
6073 }
6074}
6075
6076void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6077{
6078 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6079 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6080
6081 try
6082 {
6083 gl::Context *context = gl::getNonLostContext();
6084
6085 if (context)
6086 {
6087 if (context->getClientVersion() < 3)
6088 {
6089 return gl::error(GL_INVALID_OPERATION);
6090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006091
Jamie Madill54133512013-06-21 09:33:07 -04006092 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006093 UNIMPLEMENTED();
6094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006095 }
6096 catch(std::bad_alloc&)
6097 {
6098 return gl::error(GL_OUT_OF_MEMORY);
6099 }
6100}
6101
6102void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6103{
6104 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6105 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6106 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6107 target, level, internalformat, width, height, depth, border, format, type, pixels);
6108
6109 try
6110 {
6111 gl::Context *context = gl::getNonLostContext();
6112
6113 if (context)
6114 {
6115 if (context->getClientVersion() < 3)
6116 {
6117 return gl::error(GL_INVALID_OPERATION);
6118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006119
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006120 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006121 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006122 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006123 {
6124 return;
6125 }
6126
6127 switch(target)
6128 {
6129 case GL_TEXTURE_3D:
6130 {
6131 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006132 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006133 }
6134 break;
6135
6136 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006137 {
6138 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006139 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006140 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006141 break;
6142
6143 default:
6144 return gl::error(GL_INVALID_ENUM);
6145 }
6146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006147 }
6148 catch(std::bad_alloc&)
6149 {
6150 return gl::error(GL_OUT_OF_MEMORY);
6151 }
6152}
6153
6154void __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)
6155{
6156 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6157 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6158 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6159 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6160
6161 try
6162 {
6163 gl::Context *context = gl::getNonLostContext();
6164
6165 if (context)
6166 {
6167 if (context->getClientVersion() < 3)
6168 {
6169 return gl::error(GL_INVALID_OPERATION);
6170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006171
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006172 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006173 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006174 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006175 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006176 {
6177 return;
6178 }
6179
6180 switch(target)
6181 {
6182 case GL_TEXTURE_3D:
6183 {
6184 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006185 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006186 }
6187 break;
6188
6189 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006190 {
6191 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006192 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006193 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006194 break;
6195
6196 default:
6197 return gl::error(GL_INVALID_ENUM);
6198 }
6199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006200 }
6201 catch(std::bad_alloc&)
6202 {
6203 return gl::error(GL_OUT_OF_MEMORY);
6204 }
6205}
6206
6207void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6208{
6209 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6210 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6211 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6212
6213 try
6214 {
6215 gl::Context *context = gl::getNonLostContext();
6216
6217 if (context)
6218 {
6219 if (context->getClientVersion() < 3)
6220 {
6221 return gl::error(GL_INVALID_OPERATION);
6222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006223
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006224 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006225 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006226 {
6227 return;
6228 }
6229
6230 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6231 gl::Texture *texture = NULL;
6232 switch (target)
6233 {
6234 case GL_TEXTURE_3D:
6235 texture = context->getTexture3D();
6236 break;
6237
6238 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006239 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006240 break;
6241
6242 default:
6243 return gl::error(GL_INVALID_ENUM);
6244 }
6245
6246 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006248 }
6249 catch(std::bad_alloc&)
6250 {
6251 return gl::error(GL_OUT_OF_MEMORY);
6252 }
6253}
6254
6255void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6256{
Geoff Langeef52cc2013-10-16 15:07:39 -04006257 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 +00006258 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6259 "const GLvoid* data = 0x%0.8p)",
6260 target, level, internalformat, width, height, depth, border, imageSize, data);
6261
6262 try
6263 {
6264 gl::Context *context = gl::getNonLostContext();
6265
6266 if (context)
6267 {
6268 if (context->getClientVersion() < 3)
6269 {
6270 return gl::error(GL_INVALID_OPERATION);
6271 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006272
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006273 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 +00006274 {
6275 return gl::error(GL_INVALID_VALUE);
6276 }
6277
6278 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006279 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006280 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006281 {
6282 return;
6283 }
6284
6285 switch(target)
6286 {
6287 case GL_TEXTURE_3D:
6288 {
6289 gl::Texture3D *texture = context->getTexture3D();
6290 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6291 }
6292 break;
6293
6294 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006295 {
6296 gl::Texture2DArray *texture = context->getTexture2DArray();
6297 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6298 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006299 break;
6300
6301 default:
6302 return gl::error(GL_INVALID_ENUM);
6303 }
6304 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006305 }
6306 catch(std::bad_alloc&)
6307 {
6308 return gl::error(GL_OUT_OF_MEMORY);
6309 }
6310}
6311
6312void __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)
6313{
6314 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6315 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6316 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6317 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6318
6319 try
6320 {
6321 gl::Context *context = gl::getNonLostContext();
6322
6323 if (context)
6324 {
6325 if (context->getClientVersion() < 3)
6326 {
6327 return gl::error(GL_INVALID_OPERATION);
6328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006329
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006330 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 +00006331 {
6332 return gl::error(GL_INVALID_VALUE);
6333 }
6334
6335 if (!data)
6336 {
6337 return gl::error(GL_INVALID_VALUE);
6338 }
6339
6340 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006341 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006342 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006343 {
6344 return;
6345 }
6346
6347 switch(target)
6348 {
6349 case GL_TEXTURE_3D:
6350 {
6351 gl::Texture3D *texture = context->getTexture3D();
6352 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6353 format, imageSize, data);
6354 }
6355 break;
6356
6357 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006358 {
6359 gl::Texture2DArray *texture = context->getTexture2DArray();
6360 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6361 format, imageSize, data);
6362 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006363 break;
6364
6365 default:
6366 return gl::error(GL_INVALID_ENUM);
6367 }
6368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006369 }
6370 catch(std::bad_alloc&)
6371 {
6372 return gl::error(GL_OUT_OF_MEMORY);
6373 }
6374}
6375
6376void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6377{
6378 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6379
6380 try
6381 {
6382 gl::Context *context = gl::getNonLostContext();
6383
6384 if (context)
6385 {
6386 if (context->getClientVersion() < 3)
6387 {
6388 return gl::error(GL_INVALID_OPERATION);
6389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006390
Geoff Lang37dde692014-01-31 16:34:54 -05006391 if (n < 0)
6392 {
6393 return gl::error(GL_INVALID_VALUE);
6394 }
6395
6396 for (GLsizei i = 0; i < n; i++)
6397 {
6398 ids[i] = context->createQuery();
6399 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006401 }
6402 catch(std::bad_alloc&)
6403 {
6404 return gl::error(GL_OUT_OF_MEMORY);
6405 }
6406}
6407
6408void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6409{
6410 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6411
6412 try
6413 {
6414 gl::Context *context = gl::getNonLostContext();
6415
6416 if (context)
6417 {
6418 if (context->getClientVersion() < 3)
6419 {
6420 return gl::error(GL_INVALID_OPERATION);
6421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006422
Geoff Lang37dde692014-01-31 16:34:54 -05006423 if (n < 0)
6424 {
6425 return gl::error(GL_INVALID_VALUE);
6426 }
6427
6428 for (GLsizei i = 0; i < n; i++)
6429 {
6430 context->deleteQuery(ids[i]);
6431 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006433 }
6434 catch(std::bad_alloc&)
6435 {
6436 return gl::error(GL_OUT_OF_MEMORY);
6437 }
6438}
6439
6440GLboolean __stdcall glIsQuery(GLuint id)
6441{
6442 EVENT("(GLuint id = %u)", id);
6443
6444 try
6445 {
6446 gl::Context *context = gl::getNonLostContext();
6447
6448 if (context)
6449 {
6450 if (context->getClientVersion() < 3)
6451 {
6452 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006454
Geoff Lang37dde692014-01-31 16:34:54 -05006455 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006457 }
6458 catch(std::bad_alloc&)
6459 {
6460 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6461 }
6462
6463 return GL_FALSE;
6464}
6465
6466void __stdcall glBeginQuery(GLenum target, GLuint id)
6467{
6468 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6469
6470 try
6471 {
6472 gl::Context *context = gl::getNonLostContext();
6473
6474 if (context)
6475 {
6476 if (context->getClientVersion() < 3)
6477 {
6478 return gl::error(GL_INVALID_OPERATION);
6479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480
Geoff Lang37dde692014-01-31 16:34:54 -05006481 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006482 {
Geoff Lang37dde692014-01-31 16:34:54 -05006483 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006484 }
6485
6486 if (id == 0)
6487 {
6488 return gl::error(GL_INVALID_OPERATION);
6489 }
6490
Geoff Lang37dde692014-01-31 16:34:54 -05006491 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006493 }
6494 catch(std::bad_alloc&)
6495 {
6496 return gl::error(GL_OUT_OF_MEMORY);
6497 }
6498}
6499
6500void __stdcall glEndQuery(GLenum target)
6501{
6502 EVENT("(GLenum target = 0x%X)", target);
6503
6504 try
6505 {
6506 gl::Context *context = gl::getNonLostContext();
6507
6508 if (context)
6509 {
6510 if (context->getClientVersion() < 3)
6511 {
6512 return gl::error(GL_INVALID_OPERATION);
6513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006514
Geoff Lang37dde692014-01-31 16:34:54 -05006515 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006516 {
Geoff Lang37dde692014-01-31 16:34:54 -05006517 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006518 }
Geoff Lang37dde692014-01-31 16:34:54 -05006519
6520 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522 }
6523 catch(std::bad_alloc&)
6524 {
6525 return gl::error(GL_OUT_OF_MEMORY);
6526 }
6527}
6528
6529void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6530{
6531 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6532
6533 try
6534 {
6535 gl::Context *context = gl::getNonLostContext();
6536
6537 if (context)
6538 {
6539 if (context->getClientVersion() < 3)
6540 {
6541 return gl::error(GL_INVALID_OPERATION);
6542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006543
Geoff Lang37dde692014-01-31 16:34:54 -05006544 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006545 {
Geoff Lang37dde692014-01-31 16:34:54 -05006546 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006547 }
Geoff Lang37dde692014-01-31 16:34:54 -05006548
6549 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006550 {
Geoff Lang37dde692014-01-31 16:34:54 -05006551 case GL_CURRENT_QUERY:
6552 params[0] = context->getActiveQuery(target);
6553 break;
6554
6555 default:
6556 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006557 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006559 }
6560 catch(std::bad_alloc&)
6561 {
6562 return gl::error(GL_OUT_OF_MEMORY);
6563 }
6564}
6565
6566void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6567{
6568 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6569
6570 try
6571 {
6572 gl::Context *context = gl::getNonLostContext();
6573
6574 if (context)
6575 {
6576 if (context->getClientVersion() < 3)
6577 {
6578 return gl::error(GL_INVALID_OPERATION);
6579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580
Geoff Lang37dde692014-01-31 16:34:54 -05006581 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6582
6583 if (!queryObject)
6584 {
6585 return gl::error(GL_INVALID_OPERATION);
6586 }
6587
6588 if (context->getActiveQuery(queryObject->getType()) == id)
6589 {
6590 return gl::error(GL_INVALID_OPERATION);
6591 }
6592
6593 switch(pname)
6594 {
6595 case GL_QUERY_RESULT:
6596 params[0] = queryObject->getResult();
6597 break;
6598 case GL_QUERY_RESULT_AVAILABLE:
6599 params[0] = queryObject->isResultAvailable();
6600 break;
6601 default:
6602 return gl::error(GL_INVALID_ENUM);
6603 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006604 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006605 }
6606 catch(std::bad_alloc&)
6607 {
6608 return gl::error(GL_OUT_OF_MEMORY);
6609 }
6610}
6611
6612GLboolean __stdcall glUnmapBuffer(GLenum target)
6613{
6614 EVENT("(GLenum target = 0x%X)", target);
6615
6616 try
6617 {
6618 gl::Context *context = gl::getNonLostContext();
6619
6620 if (context)
6621 {
6622 if (context->getClientVersion() < 3)
6623 {
6624 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006626
Shannon Woodsb3801742014-03-27 14:59:19 -04006627 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006628 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006629 }
6630 catch(std::bad_alloc&)
6631 {
6632 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6633 }
6634
6635 return GL_FALSE;
6636}
6637
6638void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6639{
6640 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6641
6642 try
6643 {
6644 gl::Context *context = gl::getNonLostContext();
6645
6646 if (context)
6647 {
6648 if (context->getClientVersion() < 3)
6649 {
6650 return gl::error(GL_INVALID_OPERATION);
6651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652
Shannon Woodsb3801742014-03-27 14:59:19 -04006653 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 }
6656 catch(std::bad_alloc&)
6657 {
6658 return gl::error(GL_OUT_OF_MEMORY);
6659 }
6660}
6661
6662void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6663{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006664 try
6665 {
6666 gl::Context *context = gl::getNonLostContext();
6667
6668 if (context)
6669 {
6670 if (context->getClientVersion() < 3)
6671 {
6672 return gl::error(GL_INVALID_OPERATION);
6673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006674
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006675 glDrawBuffersEXT(n, bufs);
6676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006677 }
6678 catch(std::bad_alloc&)
6679 {
6680 return gl::error(GL_OUT_OF_MEMORY);
6681 }
6682}
6683
6684void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6685{
6686 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6687 location, count, transpose, value);
6688
6689 try
6690 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006691 if (count < 0)
6692 {
6693 return gl::error(GL_INVALID_VALUE);
6694 }
6695
6696 if (location == -1)
6697 {
6698 return;
6699 }
6700
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701 gl::Context *context = gl::getNonLostContext();
6702
6703 if (context)
6704 {
6705 if (context->getClientVersion() < 3)
6706 {
6707 return gl::error(GL_INVALID_OPERATION);
6708 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006709
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006710 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6711 if (!programBinary)
6712 {
6713 return gl::error(GL_INVALID_OPERATION);
6714 }
6715
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006716 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006717 {
6718 return gl::error(GL_INVALID_OPERATION);
6719 }
6720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006721 }
6722 catch(std::bad_alloc&)
6723 {
6724 return gl::error(GL_OUT_OF_MEMORY);
6725 }
6726}
6727
6728void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6729{
6730 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6731 location, count, transpose, value);
6732
6733 try
6734 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006735 if (count < 0)
6736 {
6737 return gl::error(GL_INVALID_VALUE);
6738 }
6739
6740 if (location == -1)
6741 {
6742 return;
6743 }
6744
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006745 gl::Context *context = gl::getNonLostContext();
6746
6747 if (context)
6748 {
6749 if (context->getClientVersion() < 3)
6750 {
6751 return gl::error(GL_INVALID_OPERATION);
6752 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006753
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006754 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6755 if (!programBinary)
6756 {
6757 return gl::error(GL_INVALID_OPERATION);
6758 }
6759
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006760 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006761 {
6762 return gl::error(GL_INVALID_OPERATION);
6763 }
6764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006765 }
6766 catch(std::bad_alloc&)
6767 {
6768 return gl::error(GL_OUT_OF_MEMORY);
6769 }
6770}
6771
6772void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6773{
6774 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6775 location, count, transpose, value);
6776
6777 try
6778 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006779 if (count < 0)
6780 {
6781 return gl::error(GL_INVALID_VALUE);
6782 }
6783
6784 if (location == -1)
6785 {
6786 return;
6787 }
6788
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789 gl::Context *context = gl::getNonLostContext();
6790
6791 if (context)
6792 {
6793 if (context->getClientVersion() < 3)
6794 {
6795 return gl::error(GL_INVALID_OPERATION);
6796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006797
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006798 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6799 if (!programBinary)
6800 {
6801 return gl::error(GL_INVALID_OPERATION);
6802 }
6803
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006804 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006805 {
6806 return gl::error(GL_INVALID_OPERATION);
6807 }
6808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006809 }
6810 catch(std::bad_alloc&)
6811 {
6812 return gl::error(GL_OUT_OF_MEMORY);
6813 }
6814}
6815
6816void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6817{
6818 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6819 location, count, transpose, value);
6820
6821 try
6822 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006823 if (count < 0)
6824 {
6825 return gl::error(GL_INVALID_VALUE);
6826 }
6827
6828 if (location == -1)
6829 {
6830 return;
6831 }
6832
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006833 gl::Context *context = gl::getNonLostContext();
6834
6835 if (context)
6836 {
6837 if (context->getClientVersion() < 3)
6838 {
6839 return gl::error(GL_INVALID_OPERATION);
6840 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006841
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006842 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6843 if (!programBinary)
6844 {
6845 return gl::error(GL_INVALID_OPERATION);
6846 }
6847
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006848 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006849 {
6850 return gl::error(GL_INVALID_OPERATION);
6851 }
6852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006853 }
6854 catch(std::bad_alloc&)
6855 {
6856 return gl::error(GL_OUT_OF_MEMORY);
6857 }
6858}
6859
6860void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6861{
6862 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6863 location, count, transpose, value);
6864
6865 try
6866 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006867 if (count < 0)
6868 {
6869 return gl::error(GL_INVALID_VALUE);
6870 }
6871
6872 if (location == -1)
6873 {
6874 return;
6875 }
6876
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006877 gl::Context *context = gl::getNonLostContext();
6878
6879 if (context)
6880 {
6881 if (context->getClientVersion() < 3)
6882 {
6883 return gl::error(GL_INVALID_OPERATION);
6884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006885
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006886 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6887 if (!programBinary)
6888 {
6889 return gl::error(GL_INVALID_OPERATION);
6890 }
6891
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006892 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006893 {
6894 return gl::error(GL_INVALID_OPERATION);
6895 }
6896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006897 }
6898 catch(std::bad_alloc&)
6899 {
6900 return gl::error(GL_OUT_OF_MEMORY);
6901 }
6902}
6903
6904void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6905{
6906 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6907 location, count, transpose, value);
6908
6909 try
6910 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006911 if (count < 0)
6912 {
6913 return gl::error(GL_INVALID_VALUE);
6914 }
6915
6916 if (location == -1)
6917 {
6918 return;
6919 }
6920
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921 gl::Context *context = gl::getNonLostContext();
6922
6923 if (context)
6924 {
6925 if (context->getClientVersion() < 3)
6926 {
6927 return gl::error(GL_INVALID_OPERATION);
6928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006929
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006930 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6931 if (!programBinary)
6932 {
6933 return gl::error(GL_INVALID_OPERATION);
6934 }
6935
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006936 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006937 {
6938 return gl::error(GL_INVALID_OPERATION);
6939 }
6940 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006941 }
6942 catch(std::bad_alloc&)
6943 {
6944 return gl::error(GL_OUT_OF_MEMORY);
6945 }
6946}
6947
6948void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6949{
6950 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6951 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6952 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6953
6954 try
6955 {
6956 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006957 if (context)
6958 {
6959 if (context->getClientVersion() < 3)
6960 {
6961 return gl::error(GL_INVALID_OPERATION);
6962 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006963
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006964 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006965 dstX0, dstY0, dstX1, dstY1, mask, filter,
6966 false))
6967 {
6968 return;
6969 }
6970
6971 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6972 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006974 }
6975 catch(std::bad_alloc&)
6976 {
6977 return gl::error(GL_OUT_OF_MEMORY);
6978 }
6979}
6980
6981void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6982{
6983 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6984 target, samples, internalformat, width, height);
6985
6986 try
6987 {
6988 gl::Context *context = gl::getNonLostContext();
6989
6990 if (context)
6991 {
6992 if (context->getClientVersion() < 3)
6993 {
6994 return gl::error(GL_INVALID_OPERATION);
6995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006997 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006998 width, height, false))
6999 {
7000 return;
7001 }
7002
7003 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007005 }
7006 catch(std::bad_alloc&)
7007 {
7008 return gl::error(GL_OUT_OF_MEMORY);
7009 }
7010}
7011
7012void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7013{
7014 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7015 target, attachment, texture, level, layer);
7016
7017 try
7018 {
7019 gl::Context *context = gl::getNonLostContext();
7020
7021 if (context)
7022 {
7023 if (context->getClientVersion() < 3)
7024 {
7025 return gl::error(GL_INVALID_OPERATION);
7026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007027
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007028 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007029 {
7030 return;
7031 }
7032
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007033 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7034 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007035
7036 gl::Texture *textureObject = context->getTexture(texture);
7037 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7038
7039 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7040 {
7041 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7042 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7043 }
7044 else
7045 {
7046 switch (attachment)
7047 {
7048 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7049 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7050 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7051 }
7052 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007053 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007054 }
7055 catch(std::bad_alloc&)
7056 {
7057 return gl::error(GL_OUT_OF_MEMORY);
7058 }
7059}
7060
7061GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7062{
7063 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7064 target, offset, length, access);
7065
7066 try
7067 {
7068 gl::Context *context = gl::getNonLostContext();
7069
7070 if (context)
7071 {
7072 if (context->getClientVersion() < 3)
7073 {
7074 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076
Shannon Woods916e7692014-03-27 16:58:22 -04007077 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007079 }
7080 catch(std::bad_alloc&)
7081 {
7082 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7083 }
7084
7085 return NULL;
7086}
7087
7088void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7089{
7090 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7091
7092 try
7093 {
7094 gl::Context *context = gl::getNonLostContext();
7095
7096 if (context)
7097 {
7098 if (context->getClientVersion() < 3)
7099 {
7100 return gl::error(GL_INVALID_OPERATION);
7101 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007102
Shannon Woods916e7692014-03-27 16:58:22 -04007103 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007104 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007105 }
7106 catch(std::bad_alloc&)
7107 {
7108 return gl::error(GL_OUT_OF_MEMORY);
7109 }
7110}
7111
7112void __stdcall glBindVertexArray(GLuint array)
7113{
7114 EVENT("(GLuint array = %u)", array);
7115
7116 try
7117 {
7118 gl::Context *context = gl::getNonLostContext();
7119
7120 if (context)
7121 {
7122 if (context->getClientVersion() < 3)
7123 {
7124 return gl::error(GL_INVALID_OPERATION);
7125 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007126
Jamie Madilld1028542013-07-02 11:57:04 -04007127 gl::VertexArray *vao = context->getVertexArray(array);
7128
7129 if (!vao)
7130 {
7131 // The default VAO should always exist
7132 ASSERT(array != 0);
7133 return gl::error(GL_INVALID_OPERATION);
7134 }
7135
7136 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007138 }
7139 catch(std::bad_alloc&)
7140 {
7141 return gl::error(GL_OUT_OF_MEMORY);
7142 }
7143}
7144
7145void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7146{
7147 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7148
7149 try
7150 {
7151 gl::Context *context = gl::getNonLostContext();
7152
7153 if (context)
7154 {
7155 if (context->getClientVersion() < 3)
7156 {
7157 return gl::error(GL_INVALID_OPERATION);
7158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007159
Jamie Madilld1028542013-07-02 11:57:04 -04007160 if (n < 0)
7161 {
7162 return gl::error(GL_INVALID_VALUE);
7163 }
7164
7165 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7166 {
7167 if (arrays[arrayIndex] != 0)
7168 {
7169 context->deleteVertexArray(arrays[arrayIndex]);
7170 }
7171 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007173 }
7174 catch(std::bad_alloc&)
7175 {
7176 return gl::error(GL_OUT_OF_MEMORY);
7177 }
7178}
7179
7180void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7181{
7182 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7183
7184 try
7185 {
7186 gl::Context *context = gl::getNonLostContext();
7187
7188 if (context)
7189 {
7190 if (context->getClientVersion() < 3)
7191 {
7192 return gl::error(GL_INVALID_OPERATION);
7193 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007194
Jamie Madilld1028542013-07-02 11:57:04 -04007195 if (n < 0)
7196 {
7197 return gl::error(GL_INVALID_VALUE);
7198 }
7199
7200 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7201 {
7202 arrays[arrayIndex] = context->createVertexArray();
7203 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007205 }
7206 catch(std::bad_alloc&)
7207 {
7208 return gl::error(GL_OUT_OF_MEMORY);
7209 }
7210}
7211
7212GLboolean __stdcall glIsVertexArray(GLuint array)
7213{
7214 EVENT("(GLuint array = %u)", array);
7215
7216 try
7217 {
7218 gl::Context *context = gl::getNonLostContext();
7219
7220 if (context)
7221 {
7222 if (context->getClientVersion() < 3)
7223 {
7224 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007226
Jamie Madilld1028542013-07-02 11:57:04 -04007227 if (array == 0)
7228 {
7229 return GL_FALSE;
7230 }
7231
7232 gl::VertexArray *vao = context->getVertexArray(array);
7233
7234 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007236 }
7237 catch(std::bad_alloc&)
7238 {
7239 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7240 }
7241
7242 return GL_FALSE;
7243}
7244
7245void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7246{
7247 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7248 target, index, data);
7249
7250 try
7251 {
7252 gl::Context *context = gl::getNonLostContext();
7253
7254 if (context)
7255 {
7256 if (context->getClientVersion() < 3)
7257 {
7258 return gl::error(GL_INVALID_OPERATION);
7259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007260
Shannon Woods15934d52013-08-19 14:28:49 -04007261 switch (target)
7262 {
7263 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7264 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7265 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7266 if (index >= context->getMaxTransformFeedbackBufferBindings())
7267 return gl::error(GL_INVALID_VALUE);
7268 break;
7269 case GL_UNIFORM_BUFFER_START:
7270 case GL_UNIFORM_BUFFER_SIZE:
7271 case GL_UNIFORM_BUFFER_BINDING:
7272 if (index >= context->getMaximumCombinedUniformBufferBindings())
7273 return gl::error(GL_INVALID_VALUE);
7274 break;
7275 default:
7276 return gl::error(GL_INVALID_ENUM);
7277 }
7278
7279 if (!(context->getIndexedIntegerv(target, index, data)))
7280 {
7281 GLenum nativeType;
7282 unsigned int numParams = 0;
7283 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7284 return gl::error(GL_INVALID_ENUM);
7285
7286 if (numParams == 0)
7287 return; // it is known that pname is valid, but there are no parameters to return
7288
7289 if (nativeType == GL_INT_64_ANGLEX)
7290 {
7291 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7292 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7293 GLint64 *int64Params = new GLint64[numParams];
7294
7295 context->getIndexedInteger64v(target, index, int64Params);
7296
7297 for (unsigned int i = 0; i < numParams; ++i)
7298 {
7299 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7300 data[i] = static_cast<GLint>(clampedValue);
7301 }
7302
7303 delete [] int64Params;
7304 }
7305 else
7306 {
7307 UNREACHABLE();
7308 }
7309 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007310 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007311 }
7312 catch(std::bad_alloc&)
7313 {
7314 return gl::error(GL_OUT_OF_MEMORY);
7315 }
7316}
7317
7318void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7319{
7320 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7321
7322 try
7323 {
7324 gl::Context *context = gl::getNonLostContext();
7325
7326 if (context)
7327 {
7328 if (context->getClientVersion() < 3)
7329 {
7330 return gl::error(GL_INVALID_OPERATION);
7331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007332
Geoff Langc8058452014-02-03 12:04:11 -05007333 switch (primitiveMode)
7334 {
7335 case GL_TRIANGLES:
7336 case GL_LINES:
7337 case GL_POINTS:
7338 break;
7339 default:
7340 return gl::error(GL_INVALID_ENUM);
7341 }
7342
7343 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7344 ASSERT(transformFeedback != NULL);
7345
7346 if (transformFeedback->isStarted())
7347 {
7348 return gl::error(GL_INVALID_OPERATION);
7349 }
7350
7351 if (transformFeedback->isPaused())
7352 {
7353 transformFeedback->resume();
7354 }
7355 else
7356 {
7357 transformFeedback->start(primitiveMode);
7358 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007359 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007360 }
7361 catch(std::bad_alloc&)
7362 {
7363 return gl::error(GL_OUT_OF_MEMORY);
7364 }
7365}
7366
7367void __stdcall glEndTransformFeedback(void)
7368{
7369 EVENT("(void)");
7370
7371 try
7372 {
7373 gl::Context *context = gl::getNonLostContext();
7374
7375 if (context)
7376 {
7377 if (context->getClientVersion() < 3)
7378 {
7379 return gl::error(GL_INVALID_OPERATION);
7380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007381
Geoff Langc8058452014-02-03 12:04:11 -05007382 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7383 ASSERT(transformFeedback != NULL);
7384
7385 if (!transformFeedback->isStarted())
7386 {
7387 return gl::error(GL_INVALID_OPERATION);
7388 }
7389
7390 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007392 }
7393 catch(std::bad_alloc&)
7394 {
7395 return gl::error(GL_OUT_OF_MEMORY);
7396 }
7397}
7398
7399void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7400{
7401 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7402 target, index, buffer, offset, size);
7403
7404 try
7405 {
7406 gl::Context *context = gl::getNonLostContext();
7407
7408 if (context)
7409 {
7410 if (context->getClientVersion() < 3)
7411 {
7412 return gl::error(GL_INVALID_OPERATION);
7413 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007414
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007415 switch (target)
7416 {
7417 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007418 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007419 {
7420 return gl::error(GL_INVALID_VALUE);
7421 }
7422 break;
7423
7424 case GL_UNIFORM_BUFFER:
7425 if (index >= context->getMaximumCombinedUniformBufferBindings())
7426 {
7427 return gl::error(GL_INVALID_VALUE);
7428 }
7429 break;
7430
7431 default:
7432 return gl::error(GL_INVALID_ENUM);
7433 }
7434
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007435 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007436 {
7437 return gl::error(GL_INVALID_VALUE);
7438 }
7439
7440 switch (target)
7441 {
7442 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007443
7444 // size and offset must be a multiple of 4
7445 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7446 {
7447 return gl::error(GL_INVALID_VALUE);
7448 }
7449
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007450 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7451 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007452 break;
7453
7454 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007455
7456 // it is an error to bind an offset not a multiple of the alignment
7457 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7458 {
7459 return gl::error(GL_INVALID_VALUE);
7460 }
7461
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007462 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7463 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007464 break;
7465
7466 default:
7467 UNREACHABLE();
7468 }
7469 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007470 }
7471 catch(std::bad_alloc&)
7472 {
7473 return gl::error(GL_OUT_OF_MEMORY);
7474 }
7475}
7476
7477void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7478{
7479 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7480 target, index, buffer);
7481
7482 try
7483 {
7484 gl::Context *context = gl::getNonLostContext();
7485
7486 if (context)
7487 {
7488 if (context->getClientVersion() < 3)
7489 {
7490 return gl::error(GL_INVALID_OPERATION);
7491 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007492
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007493 switch (target)
7494 {
7495 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007496 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007497 {
7498 return gl::error(GL_INVALID_VALUE);
7499 }
7500 break;
7501
7502 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007503 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007504 {
7505 return gl::error(GL_INVALID_VALUE);
7506 }
7507 break;
7508
7509 default:
7510 return gl::error(GL_INVALID_ENUM);
7511 }
7512
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007513 switch (target)
7514 {
7515 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007516 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007517 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007518 break;
7519
7520 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007521 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007522 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007523 break;
7524
7525 default:
7526 UNREACHABLE();
7527 }
7528 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007529 }
7530 catch(std::bad_alloc&)
7531 {
7532 return gl::error(GL_OUT_OF_MEMORY);
7533 }
7534}
7535
7536void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7537{
7538 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7539 program, count, varyings, bufferMode);
7540
7541 try
7542 {
7543 gl::Context *context = gl::getNonLostContext();
7544
7545 if (context)
7546 {
7547 if (context->getClientVersion() < 3)
7548 {
7549 return gl::error(GL_INVALID_OPERATION);
7550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007551
Geoff Lang48dcae72014-02-05 16:28:24 -05007552 if (count < 0)
7553 {
7554 return gl::error(GL_INVALID_VALUE);
7555 }
7556
7557 switch (bufferMode)
7558 {
7559 case GL_INTERLEAVED_ATTRIBS:
7560 break;
7561 case GL_SEPARATE_ATTRIBS:
7562 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7563 {
7564 return gl::error(GL_INVALID_VALUE);
7565 }
7566 break;
7567 default:
7568 return gl::error(GL_INVALID_ENUM);
7569 }
7570
7571 if (!gl::ValidProgram(context, program))
7572 {
7573 return;
7574 }
7575
7576 gl::Program *programObject = context->getProgram(program);
7577 ASSERT(programObject);
7578
7579 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007581 }
7582 catch(std::bad_alloc&)
7583 {
7584 return gl::error(GL_OUT_OF_MEMORY);
7585 }
7586}
7587
7588void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7589{
7590 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7591 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7592 program, index, bufSize, length, size, type, name);
7593
7594 try
7595 {
7596 gl::Context *context = gl::getNonLostContext();
7597
7598 if (context)
7599 {
7600 if (context->getClientVersion() < 3)
7601 {
7602 return gl::error(GL_INVALID_OPERATION);
7603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007604
Geoff Lang48dcae72014-02-05 16:28:24 -05007605 if (bufSize < 0)
7606 {
7607 return gl::error(GL_INVALID_VALUE);
7608 }
7609
7610 if (!gl::ValidProgram(context, program))
7611 {
7612 return;
7613 }
7614
7615 gl::Program *programObject = context->getProgram(program);
7616 ASSERT(programObject);
7617
7618 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7619 {
7620 return gl::error(GL_INVALID_VALUE);
7621 }
7622
7623 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007624 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007625 }
7626 catch(std::bad_alloc&)
7627 {
7628 return gl::error(GL_OUT_OF_MEMORY);
7629 }
7630}
7631
7632void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7633{
7634 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7635 index, size, type, stride, pointer);
7636
7637 try
7638 {
7639 gl::Context *context = gl::getNonLostContext();
7640
7641 if (context)
7642 {
7643 if (context->getClientVersion() < 3)
7644 {
7645 return gl::error(GL_INVALID_OPERATION);
7646 }
7647 }
7648
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007649 if (index >= gl::MAX_VERTEX_ATTRIBS)
7650 {
7651 return gl::error(GL_INVALID_VALUE);
7652 }
7653
7654 if (size < 1 || size > 4)
7655 {
7656 return gl::error(GL_INVALID_VALUE);
7657 }
7658
7659 switch (type)
7660 {
7661 case GL_BYTE:
7662 case GL_UNSIGNED_BYTE:
7663 case GL_SHORT:
7664 case GL_UNSIGNED_SHORT:
7665 case GL_INT:
7666 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007667 case GL_INT_2_10_10_10_REV:
7668 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007669 break;
7670 default:
7671 return gl::error(GL_INVALID_ENUM);
7672 }
7673
7674 if (stride < 0)
7675 {
7676 return gl::error(GL_INVALID_VALUE);
7677 }
7678
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007679 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7680 {
7681 return gl::error(GL_INVALID_OPERATION);
7682 }
7683
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007684 if (context)
7685 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007686 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7687 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7688 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7689 // and the pointer argument is not NULL.
7690 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7691 {
7692 return gl::error(GL_INVALID_OPERATION);
7693 }
7694
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007695 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7696 stride, pointer);
7697 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007698 }
7699 catch(std::bad_alloc&)
7700 {
7701 return gl::error(GL_OUT_OF_MEMORY);
7702 }
7703}
7704
7705void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7706{
7707 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7708 index, pname, params);
7709
7710 try
7711 {
7712 gl::Context *context = gl::getNonLostContext();
7713
7714 if (context)
7715 {
7716 if (context->getClientVersion() < 3)
7717 {
7718 return gl::error(GL_INVALID_OPERATION);
7719 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007720
Jamie Madilla7d05862013-07-02 11:57:06 -04007721 if (index >= gl::MAX_VERTEX_ATTRIBS)
7722 {
7723 return gl::error(GL_INVALID_VALUE);
7724 }
7725
7726 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7727
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007728 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007729 {
7730 return;
7731 }
7732
7733 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7734 {
7735 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7736 for (int i = 0; i < 4; ++i)
7737 {
7738 params[i] = currentValueData.IntValues[i];
7739 }
7740 }
7741 else
7742 {
7743 *params = attribState.querySingleParameter<GLint>(pname);
7744 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007745 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007746 }
7747 catch(std::bad_alloc&)
7748 {
7749 return gl::error(GL_OUT_OF_MEMORY);
7750 }
7751}
7752
7753void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7754{
7755 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7756 index, pname, params);
7757
7758 try
7759 {
7760 gl::Context *context = gl::getNonLostContext();
7761
7762 if (context)
7763 {
7764 if (context->getClientVersion() < 3)
7765 {
7766 return gl::error(GL_INVALID_OPERATION);
7767 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007768
Jamie Madilla7d05862013-07-02 11:57:06 -04007769 if (index >= gl::MAX_VERTEX_ATTRIBS)
7770 {
7771 return gl::error(GL_INVALID_VALUE);
7772 }
7773
7774 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7775
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007776 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007777 {
7778 return;
7779 }
7780
7781 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7782 {
7783 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7784 for (int i = 0; i < 4; ++i)
7785 {
7786 params[i] = currentValueData.UnsignedIntValues[i];
7787 }
7788 }
7789 else
7790 {
7791 *params = attribState.querySingleParameter<GLuint>(pname);
7792 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007794 }
7795 catch(std::bad_alloc&)
7796 {
7797 return gl::error(GL_OUT_OF_MEMORY);
7798 }
7799}
7800
7801void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7802{
7803 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7804 index, x, y, z, w);
7805
7806 try
7807 {
7808 gl::Context *context = gl::getNonLostContext();
7809
7810 if (context)
7811 {
7812 if (context->getClientVersion() < 3)
7813 {
7814 return gl::error(GL_INVALID_OPERATION);
7815 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007816
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007817 if (index >= gl::MAX_VERTEX_ATTRIBS)
7818 {
7819 return gl::error(GL_INVALID_VALUE);
7820 }
7821
7822 GLint vals[4] = { x, y, z, w };
7823 context->setVertexAttribi(index, vals);
7824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007825 }
7826 catch(std::bad_alloc&)
7827 {
7828 return gl::error(GL_OUT_OF_MEMORY);
7829 }
7830}
7831
7832void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7833{
7834 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7835 index, x, y, z, w);
7836
7837 try
7838 {
7839 gl::Context *context = gl::getNonLostContext();
7840
7841 if (context)
7842 {
7843 if (context->getClientVersion() < 3)
7844 {
7845 return gl::error(GL_INVALID_OPERATION);
7846 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007847
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007848 if (index >= gl::MAX_VERTEX_ATTRIBS)
7849 {
7850 return gl::error(GL_INVALID_VALUE);
7851 }
7852
7853 GLuint vals[4] = { x, y, z, w };
7854 context->setVertexAttribu(index, vals);
7855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007856 }
7857 catch(std::bad_alloc&)
7858 {
7859 return gl::error(GL_OUT_OF_MEMORY);
7860 }
7861}
7862
7863void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7864{
7865 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7866
7867 try
7868 {
7869 gl::Context *context = gl::getNonLostContext();
7870
7871 if (context)
7872 {
7873 if (context->getClientVersion() < 3)
7874 {
7875 return gl::error(GL_INVALID_OPERATION);
7876 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007877
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007878 if (index >= gl::MAX_VERTEX_ATTRIBS)
7879 {
7880 return gl::error(GL_INVALID_VALUE);
7881 }
7882
7883 context->setVertexAttribi(index, v);
7884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007885 }
7886 catch(std::bad_alloc&)
7887 {
7888 return gl::error(GL_OUT_OF_MEMORY);
7889 }
7890}
7891
7892void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7893{
7894 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7895
7896 try
7897 {
7898 gl::Context *context = gl::getNonLostContext();
7899
7900 if (context)
7901 {
7902 if (context->getClientVersion() < 3)
7903 {
7904 return gl::error(GL_INVALID_OPERATION);
7905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007906
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007907 if (index >= gl::MAX_VERTEX_ATTRIBS)
7908 {
7909 return gl::error(GL_INVALID_VALUE);
7910 }
7911
7912 context->setVertexAttribu(index, v);
7913 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007914 }
7915 catch(std::bad_alloc&)
7916 {
7917 return gl::error(GL_OUT_OF_MEMORY);
7918 }
7919}
7920
7921void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7922{
7923 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7924 program, location, params);
7925
7926 try
7927 {
7928 gl::Context *context = gl::getNonLostContext();
7929
7930 if (context)
7931 {
7932 if (context->getClientVersion() < 3)
7933 {
7934 return gl::error(GL_INVALID_OPERATION);
7935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007936
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007937 if (program == 0)
7938 {
7939 return gl::error(GL_INVALID_VALUE);
7940 }
7941
7942 gl::Program *programObject = context->getProgram(program);
7943
7944 if (!programObject || !programObject->isLinked())
7945 {
7946 return gl::error(GL_INVALID_OPERATION);
7947 }
7948
7949 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7950 if (!programBinary)
7951 {
7952 return gl::error(GL_INVALID_OPERATION);
7953 }
7954
7955 if (!programBinary->getUniformuiv(location, NULL, params))
7956 {
7957 return gl::error(GL_INVALID_OPERATION);
7958 }
7959 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007960 }
7961 catch(std::bad_alloc&)
7962 {
7963 return gl::error(GL_OUT_OF_MEMORY);
7964 }
7965}
7966
7967GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7968{
7969 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7970 program, name);
7971
7972 try
7973 {
7974 gl::Context *context = gl::getNonLostContext();
7975
7976 if (context)
7977 {
7978 if (context->getClientVersion() < 3)
7979 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007980 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007982
Jamie Madilld1e78c92013-06-20 11:55:50 -04007983 if (program == 0)
7984 {
7985 return gl::error(GL_INVALID_VALUE, -1);
7986 }
7987
7988 gl::Program *programObject = context->getProgram(program);
7989
7990 if (!programObject || !programObject->isLinked())
7991 {
7992 return gl::error(GL_INVALID_OPERATION, -1);
7993 }
7994
7995 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7996 if (!programBinary)
7997 {
7998 return gl::error(GL_INVALID_OPERATION, -1);
7999 }
8000
8001 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008003 }
8004 catch(std::bad_alloc&)
8005 {
8006 return gl::error(GL_OUT_OF_MEMORY, 0);
8007 }
8008
8009 return 0;
8010}
8011
8012void __stdcall glUniform1ui(GLint location, GLuint v0)
8013{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008014 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008015}
8016
8017void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8018{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008019 const GLuint xy[] = { v0, v1 };
8020 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008021}
8022
8023void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8024{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008025 const GLuint xyz[] = { v0, v1, v2 };
8026 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008027}
8028
8029void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8030{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008031 const GLuint xyzw[] = { v0, v1, v2, v3 };
8032 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008033}
8034
8035void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8036{
8037 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8038 location, count, value);
8039
8040 try
8041 {
8042 gl::Context *context = gl::getNonLostContext();
8043
8044 if (context)
8045 {
8046 if (context->getClientVersion() < 3)
8047 {
8048 return gl::error(GL_INVALID_OPERATION);
8049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008050
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008051 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8052 if (!programBinary)
8053 {
8054 return gl::error(GL_INVALID_OPERATION);
8055 }
8056
8057 if (!programBinary->setUniform1uiv(location, count, value))
8058 {
8059 return gl::error(GL_INVALID_OPERATION);
8060 }
8061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008062 }
8063 catch(std::bad_alloc&)
8064 {
8065 return gl::error(GL_OUT_OF_MEMORY);
8066 }
8067}
8068
8069void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8070{
8071 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8072 location, count, value);
8073
8074 try
8075 {
8076 gl::Context *context = gl::getNonLostContext();
8077
8078 if (context)
8079 {
8080 if (context->getClientVersion() < 3)
8081 {
8082 return gl::error(GL_INVALID_OPERATION);
8083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008085 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8086 if (!programBinary)
8087 {
8088 return gl::error(GL_INVALID_OPERATION);
8089 }
8090
8091 if (!programBinary->setUniform2uiv(location, count, value))
8092 {
8093 return gl::error(GL_INVALID_OPERATION);
8094 }
8095 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008096 }
8097 catch(std::bad_alloc&)
8098 {
8099 return gl::error(GL_OUT_OF_MEMORY);
8100 }
8101}
8102
8103void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8104{
8105 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8106 location, count, value);
8107
8108 try
8109 {
8110 gl::Context *context = gl::getNonLostContext();
8111
8112 if (context)
8113 {
8114 if (context->getClientVersion() < 3)
8115 {
8116 return gl::error(GL_INVALID_OPERATION);
8117 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008118
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008119 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8120 if (!programBinary)
8121 {
8122 return gl::error(GL_INVALID_OPERATION);
8123 }
8124
8125 if (!programBinary->setUniform3uiv(location, count, value))
8126 {
8127 return gl::error(GL_INVALID_OPERATION);
8128 }
8129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008130 }
8131 catch(std::bad_alloc&)
8132 {
8133 return gl::error(GL_OUT_OF_MEMORY);
8134 }
8135}
8136
8137void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8138{
8139 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8140 location, count, value);
8141
8142 try
8143 {
8144 gl::Context *context = gl::getNonLostContext();
8145
8146 if (context)
8147 {
8148 if (context->getClientVersion() < 3)
8149 {
8150 return gl::error(GL_INVALID_OPERATION);
8151 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008152
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008153 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8154 if (!programBinary)
8155 {
8156 return gl::error(GL_INVALID_OPERATION);
8157 }
8158
8159 if (!programBinary->setUniform4uiv(location, count, value))
8160 {
8161 return gl::error(GL_INVALID_OPERATION);
8162 }
8163 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164 }
8165 catch(std::bad_alloc&)
8166 {
8167 return gl::error(GL_OUT_OF_MEMORY);
8168 }
8169}
8170
8171void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8172{
8173 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8174 buffer, drawbuffer, value);
8175
8176 try
8177 {
8178 gl::Context *context = gl::getNonLostContext();
8179
8180 if (context)
8181 {
8182 if (context->getClientVersion() < 3)
8183 {
8184 return gl::error(GL_INVALID_OPERATION);
8185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008186
Geoff Lang42359ca2013-08-21 13:25:17 -04008187 switch (buffer)
8188 {
8189 case GL_COLOR:
8190 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8191 {
8192 return gl::error(GL_INVALID_VALUE);
8193 }
8194 break;
8195 case GL_STENCIL:
8196 if (drawbuffer != 0)
8197 {
8198 return gl::error(GL_INVALID_VALUE);
8199 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008200 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008201 default:
8202 return gl::error(GL_INVALID_ENUM);
8203 }
8204
8205 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008206 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008207 }
8208 catch(std::bad_alloc&)
8209 {
8210 return gl::error(GL_OUT_OF_MEMORY);
8211 }
8212}
8213
8214void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8215{
8216 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8217 buffer, drawbuffer, value);
8218
8219 try
8220 {
8221 gl::Context *context = gl::getNonLostContext();
8222
8223 if (context)
8224 {
8225 if (context->getClientVersion() < 3)
8226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008229
Geoff Lang42359ca2013-08-21 13:25:17 -04008230 switch (buffer)
8231 {
8232 case GL_COLOR:
8233 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8234 {
8235 return gl::error(GL_INVALID_VALUE);
8236 }
8237 break;
8238 default:
8239 return gl::error(GL_INVALID_ENUM);
8240 }
8241
8242 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008244 }
8245 catch(std::bad_alloc&)
8246 {
8247 return gl::error(GL_OUT_OF_MEMORY);
8248 }
8249}
8250
8251void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8252{
8253 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8254 buffer, drawbuffer, value);
8255
8256 try
8257 {
8258 gl::Context *context = gl::getNonLostContext();
8259
8260 if (context)
8261 {
8262 if (context->getClientVersion() < 3)
8263 {
8264 return gl::error(GL_INVALID_OPERATION);
8265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008266
Geoff Lang42359ca2013-08-21 13:25:17 -04008267 switch (buffer)
8268 {
8269 case GL_COLOR:
8270 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8271 {
8272 return gl::error(GL_INVALID_VALUE);
8273 }
8274 break;
8275 case GL_DEPTH:
8276 if (drawbuffer != 0)
8277 {
8278 return gl::error(GL_INVALID_VALUE);
8279 }
8280 break;
8281 default:
8282 return gl::error(GL_INVALID_ENUM);
8283 }
8284
8285 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008287 }
8288 catch(std::bad_alloc&)
8289 {
8290 return gl::error(GL_OUT_OF_MEMORY);
8291 }
8292}
8293
8294void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8295{
8296 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8297 buffer, drawbuffer, depth, stencil);
8298
8299 try
8300 {
8301 gl::Context *context = gl::getNonLostContext();
8302
8303 if (context)
8304 {
8305 if (context->getClientVersion() < 3)
8306 {
8307 return gl::error(GL_INVALID_OPERATION);
8308 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008309
Geoff Lang42359ca2013-08-21 13:25:17 -04008310 switch (buffer)
8311 {
8312 case GL_DEPTH_STENCIL:
8313 if (drawbuffer != 0)
8314 {
8315 return gl::error(GL_INVALID_VALUE);
8316 }
8317 break;
8318 default:
8319 return gl::error(GL_INVALID_ENUM);
8320 }
8321
8322 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008324 }
8325 catch(std::bad_alloc&)
8326 {
8327 return gl::error(GL_OUT_OF_MEMORY);
8328 }
8329}
8330
8331const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8332{
8333 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8334
8335 try
8336 {
8337 gl::Context *context = gl::getNonLostContext();
8338
8339 if (context)
8340 {
8341 if (context->getClientVersion() < 3)
8342 {
8343 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8344 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008345
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008346 if (name != GL_EXTENSIONS)
8347 {
8348 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8349 }
8350
8351 if (index >= context->getNumExtensions())
8352 {
8353 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8354 }
8355
8356 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008358 }
8359 catch(std::bad_alloc&)
8360 {
8361 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8362 }
8363
8364 return NULL;
8365}
8366
8367void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8368{
8369 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8370 readTarget, writeTarget, readOffset, writeOffset, size);
8371
8372 try
8373 {
8374 gl::Context *context = gl::getNonLostContext();
8375
8376 if (context)
8377 {
8378 if (context->getClientVersion() < 3)
8379 {
8380 return gl::error(GL_INVALID_OPERATION);
8381 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008382
Jamie Madill8c96d582014-03-05 15:01:23 -05008383 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008384 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008385 return gl::error(GL_INVALID_ENUM);
8386 }
8387
Jamie Madill8c96d582014-03-05 15:01:23 -05008388 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8389 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008390
8391 if (!readBuffer || !writeBuffer)
8392 {
8393 return gl::error(GL_INVALID_OPERATION);
8394 }
8395
Jamie Madill7a5f7382014-03-05 15:01:24 -05008396 if (readBuffer->mapped() || writeBuffer->mapped())
8397 {
8398 return gl::error(GL_INVALID_OPERATION);
8399 }
8400
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008401 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8402 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8403 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8404 {
8405 return gl::error(GL_INVALID_VALUE);
8406 }
8407
8408 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8409 {
8410 return gl::error(GL_INVALID_VALUE);
8411 }
8412
8413 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8414
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008415 // if size is zero, the copy is a successful no-op
8416 if (size > 0)
8417 {
8418 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8419 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008421 }
8422 catch(std::bad_alloc&)
8423 {
8424 return gl::error(GL_OUT_OF_MEMORY);
8425 }
8426}
8427
8428void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8429{
8430 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8431 program, uniformCount, uniformNames, uniformIndices);
8432
8433 try
8434 {
8435 gl::Context *context = gl::getNonLostContext();
8436
8437 if (context)
8438 {
8439 if (context->getClientVersion() < 3)
8440 {
8441 return gl::error(GL_INVALID_OPERATION);
8442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008443
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008444 if (uniformCount < 0)
8445 {
8446 return gl::error(GL_INVALID_VALUE);
8447 }
8448
8449 gl::Program *programObject = context->getProgram(program);
8450
8451 if (!programObject)
8452 {
8453 if (context->getShader(program))
8454 {
8455 return gl::error(GL_INVALID_OPERATION);
8456 }
8457 else
8458 {
8459 return gl::error(GL_INVALID_VALUE);
8460 }
8461 }
8462
8463 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8464 if (!programObject->isLinked() || !programBinary)
8465 {
8466 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8467 {
8468 uniformIndices[uniformId] = GL_INVALID_INDEX;
8469 }
8470 }
8471 else
8472 {
8473 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8474 {
8475 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8476 }
8477 }
8478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008479 }
8480 catch(std::bad_alloc&)
8481 {
8482 return gl::error(GL_OUT_OF_MEMORY);
8483 }
8484}
8485
8486void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8487{
8488 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8489 program, uniformCount, uniformIndices, pname, params);
8490
8491 try
8492 {
8493 gl::Context *context = gl::getNonLostContext();
8494
8495 if (context)
8496 {
8497 if (context->getClientVersion() < 3)
8498 {
8499 return gl::error(GL_INVALID_OPERATION);
8500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008501
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008502 if (uniformCount < 0)
8503 {
8504 return gl::error(GL_INVALID_VALUE);
8505 }
8506
8507 gl::Program *programObject = context->getProgram(program);
8508
8509 if (!programObject)
8510 {
8511 if (context->getShader(program))
8512 {
8513 return gl::error(GL_INVALID_OPERATION);
8514 }
8515 else
8516 {
8517 return gl::error(GL_INVALID_VALUE);
8518 }
8519 }
8520
8521 switch (pname)
8522 {
8523 case GL_UNIFORM_TYPE:
8524 case GL_UNIFORM_SIZE:
8525 case GL_UNIFORM_NAME_LENGTH:
8526 case GL_UNIFORM_BLOCK_INDEX:
8527 case GL_UNIFORM_OFFSET:
8528 case GL_UNIFORM_ARRAY_STRIDE:
8529 case GL_UNIFORM_MATRIX_STRIDE:
8530 case GL_UNIFORM_IS_ROW_MAJOR:
8531 break;
8532 default:
8533 return gl::error(GL_INVALID_ENUM);
8534 }
8535
8536 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8537
8538 if (!programBinary && uniformCount > 0)
8539 {
8540 return gl::error(GL_INVALID_VALUE);
8541 }
8542
8543 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8544 {
8545 const GLuint index = uniformIndices[uniformId];
8546
8547 if (index >= (GLuint)programBinary->getActiveUniformCount())
8548 {
8549 return gl::error(GL_INVALID_VALUE);
8550 }
8551 }
8552
8553 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8554 {
8555 const GLuint index = uniformIndices[uniformId];
8556 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8557 }
8558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008559 }
8560 catch(std::bad_alloc&)
8561 {
8562 return gl::error(GL_OUT_OF_MEMORY);
8563 }
8564}
8565
8566GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8567{
8568 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8569
8570 try
8571 {
8572 gl::Context *context = gl::getNonLostContext();
8573
8574 if (context)
8575 {
8576 if (context->getClientVersion() < 3)
8577 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008578 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008580
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008581 gl::Program *programObject = context->getProgram(program);
8582
8583 if (!programObject)
8584 {
8585 if (context->getShader(program))
8586 {
8587 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8588 }
8589 else
8590 {
8591 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8592 }
8593 }
8594
8595 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8596 if (!programBinary)
8597 {
8598 return GL_INVALID_INDEX;
8599 }
8600
8601 return programBinary->getUniformBlockIndex(uniformBlockName);
8602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008603 }
8604 catch(std::bad_alloc&)
8605 {
8606 return gl::error(GL_OUT_OF_MEMORY, 0);
8607 }
8608
8609 return 0;
8610}
8611
8612void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8613{
8614 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8615 program, uniformBlockIndex, pname, params);
8616
8617 try
8618 {
8619 gl::Context *context = gl::getNonLostContext();
8620
8621 if (context)
8622 {
8623 if (context->getClientVersion() < 3)
8624 {
8625 return gl::error(GL_INVALID_OPERATION);
8626 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008627 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008628
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008629 if (!programObject)
8630 {
8631 if (context->getShader(program))
8632 {
8633 return gl::error(GL_INVALID_OPERATION);
8634 }
8635 else
8636 {
8637 return gl::error(GL_INVALID_VALUE);
8638 }
8639 }
8640
8641 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8642
8643 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8644 {
8645 return gl::error(GL_INVALID_VALUE);
8646 }
8647
8648 switch (pname)
8649 {
8650 case GL_UNIFORM_BLOCK_BINDING:
8651 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8652 break;
8653
8654 case GL_UNIFORM_BLOCK_DATA_SIZE:
8655 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8656 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8657 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8658 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8659 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8660 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8661 break;
8662
8663 default:
8664 return gl::error(GL_INVALID_ENUM);
8665 }
8666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008667 }
8668 catch(std::bad_alloc&)
8669 {
8670 return gl::error(GL_OUT_OF_MEMORY);
8671 }
8672}
8673
8674void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8675{
8676 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8677 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8678
8679 try
8680 {
8681 gl::Context *context = gl::getNonLostContext();
8682
8683 if (context)
8684 {
8685 if (context->getClientVersion() < 3)
8686 {
8687 return gl::error(GL_INVALID_OPERATION);
8688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008689
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008690 gl::Program *programObject = context->getProgram(program);
8691
8692 if (!programObject)
8693 {
8694 if (context->getShader(program))
8695 {
8696 return gl::error(GL_INVALID_OPERATION);
8697 }
8698 else
8699 {
8700 return gl::error(GL_INVALID_VALUE);
8701 }
8702 }
8703
8704 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8705
8706 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8707 {
8708 return gl::error(GL_INVALID_VALUE);
8709 }
8710
8711 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008713 }
8714 catch(std::bad_alloc&)
8715 {
8716 return gl::error(GL_OUT_OF_MEMORY);
8717 }
8718}
8719
8720void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8721{
8722 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8723 program, uniformBlockIndex, uniformBlockBinding);
8724
8725 try
8726 {
8727 gl::Context *context = gl::getNonLostContext();
8728
8729 if (context)
8730 {
8731 if (context->getClientVersion() < 3)
8732 {
8733 return gl::error(GL_INVALID_OPERATION);
8734 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008735
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008736 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8737 {
8738 return gl::error(GL_INVALID_VALUE);
8739 }
8740
8741 gl::Program *programObject = context->getProgram(program);
8742
8743 if (!programObject)
8744 {
8745 if (context->getShader(program))
8746 {
8747 return gl::error(GL_INVALID_OPERATION);
8748 }
8749 else
8750 {
8751 return gl::error(GL_INVALID_VALUE);
8752 }
8753 }
8754
8755 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8756
8757 // if never linked, there won't be any uniform blocks
8758 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8759 {
8760 return gl::error(GL_INVALID_VALUE);
8761 }
8762
8763 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008765 }
8766 catch(std::bad_alloc&)
8767 {
8768 return gl::error(GL_OUT_OF_MEMORY);
8769 }
8770}
8771
8772void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8773{
8774 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8775 mode, first, count, instanceCount);
8776
8777 try
8778 {
8779 gl::Context *context = gl::getNonLostContext();
8780
8781 if (context)
8782 {
8783 if (context->getClientVersion() < 3)
8784 {
8785 return gl::error(GL_INVALID_OPERATION);
8786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008787
Jamie Madill54133512013-06-21 09:33:07 -04008788 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008789 UNIMPLEMENTED();
8790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008791 }
8792 catch(std::bad_alloc&)
8793 {
8794 return gl::error(GL_OUT_OF_MEMORY);
8795 }
8796}
8797
8798void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8799{
8800 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8801 mode, count, type, indices, instanceCount);
8802
8803 try
8804 {
8805 gl::Context *context = gl::getNonLostContext();
8806
8807 if (context)
8808 {
8809 if (context->getClientVersion() < 3)
8810 {
8811 return gl::error(GL_INVALID_OPERATION);
8812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008813
Jamie Madill54133512013-06-21 09:33:07 -04008814 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008815 UNIMPLEMENTED();
8816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008817 }
8818 catch(std::bad_alloc&)
8819 {
8820 return gl::error(GL_OUT_OF_MEMORY);
8821 }
8822}
8823
8824GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8825{
8826 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8827
8828 try
8829 {
8830 gl::Context *context = gl::getNonLostContext();
8831
8832 if (context)
8833 {
8834 if (context->getClientVersion() < 3)
8835 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008836 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008838
Jamie Madill5215e1a2013-07-26 11:55:19 -04008839 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8840 {
8841 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8842 }
8843
8844 if (flags != 0)
8845 {
8846 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8847 }
8848
8849 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008851 }
8852 catch(std::bad_alloc&)
8853 {
8854 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8855 }
8856
8857 return NULL;
8858}
8859
8860GLboolean __stdcall glIsSync(GLsync sync)
8861{
8862 EVENT("(GLsync sync = 0x%0.8p)", sync);
8863
8864 try
8865 {
8866 gl::Context *context = gl::getNonLostContext();
8867
8868 if (context)
8869 {
8870 if (context->getClientVersion() < 3)
8871 {
8872 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008874
Jamie Madill5215e1a2013-07-26 11:55:19 -04008875 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008876 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008877 }
8878 catch(std::bad_alloc&)
8879 {
8880 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8881 }
8882
8883 return GL_FALSE;
8884}
8885
8886void __stdcall glDeleteSync(GLsync sync)
8887{
8888 EVENT("(GLsync sync = 0x%0.8p)", sync);
8889
8890 try
8891 {
8892 gl::Context *context = gl::getNonLostContext();
8893
8894 if (context)
8895 {
8896 if (context->getClientVersion() < 3)
8897 {
8898 return gl::error(GL_INVALID_OPERATION);
8899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008900
Jamie Madill5215e1a2013-07-26 11:55:19 -04008901 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8902 {
8903 return gl::error(GL_INVALID_VALUE);
8904 }
8905
8906 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008907 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008908 }
8909 catch(std::bad_alloc&)
8910 {
8911 return gl::error(GL_OUT_OF_MEMORY);
8912 }
8913}
8914
8915GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8916{
8917 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8918 sync, flags, timeout);
8919
8920 try
8921 {
8922 gl::Context *context = gl::getNonLostContext();
8923
8924 if (context)
8925 {
8926 if (context->getClientVersion() < 3)
8927 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008928 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008929 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008930
Jamie Madill5215e1a2013-07-26 11:55:19 -04008931 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8932 {
8933 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8934 }
8935
8936 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8937
8938 if (!fenceSync)
8939 {
8940 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8941 }
8942
8943 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008944 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008945 }
8946 catch(std::bad_alloc&)
8947 {
8948 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8949 }
8950
8951 return GL_FALSE;
8952}
8953
8954void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8955{
8956 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8957 sync, flags, timeout);
8958
8959 try
8960 {
8961 gl::Context *context = gl::getNonLostContext();
8962
8963 if (context)
8964 {
8965 if (context->getClientVersion() < 3)
8966 {
8967 return gl::error(GL_INVALID_OPERATION);
8968 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008969
Jamie Madill5215e1a2013-07-26 11:55:19 -04008970 if (flags != 0)
8971 {
8972 return gl::error(GL_INVALID_VALUE);
8973 }
8974
8975 if (timeout != GL_TIMEOUT_IGNORED)
8976 {
8977 return gl::error(GL_INVALID_VALUE);
8978 }
8979
8980 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8981
8982 if (!fenceSync)
8983 {
8984 return gl::error(GL_INVALID_VALUE);
8985 }
8986
8987 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008989 }
8990 catch(std::bad_alloc&)
8991 {
8992 return gl::error(GL_OUT_OF_MEMORY);
8993 }
8994}
8995
8996void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8997{
8998 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8999 pname, params);
9000
9001 try
9002 {
9003 gl::Context *context = gl::getNonLostContext();
9004
9005 if (context)
9006 {
9007 if (context->getClientVersion() < 3)
9008 {
9009 return gl::error(GL_INVALID_OPERATION);
9010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009011
Jamie Madill79f2f452013-12-19 11:13:02 -05009012 GLenum nativeType;
9013 unsigned int numParams = 0;
9014 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9015 return gl::error(GL_INVALID_ENUM);
9016
9017 // pname is valid, but that there are no parameters to return.
9018 if (numParams == 0)
9019 return;
9020
9021 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009022 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009023 context->getInteger64v(pname, params);
9024 }
Jamie Madill55856b12014-01-02 13:59:50 -05009025 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009026 {
Jamie Madill55856b12014-01-02 13:59:50 -05009027 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009028 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009030 }
9031 catch(std::bad_alloc&)
9032 {
9033 return gl::error(GL_OUT_OF_MEMORY);
9034 }
9035}
9036
9037void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9038{
9039 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9040 sync, pname, bufSize, length, values);
9041
9042 try
9043 {
9044 gl::Context *context = gl::getNonLostContext();
9045
9046 if (context)
9047 {
9048 if (context->getClientVersion() < 3)
9049 {
9050 return gl::error(GL_INVALID_OPERATION);
9051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009052
Jamie Madill5215e1a2013-07-26 11:55:19 -04009053 if (bufSize < 0)
9054 {
9055 return gl::error(GL_INVALID_VALUE);
9056 }
9057
9058 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9059
9060 if (!fenceSync)
9061 {
9062 return gl::error(GL_INVALID_VALUE);
9063 }
9064
9065 switch (pname)
9066 {
9067 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9068 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9069 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9070 case GL_SYNC_FLAGS: values[0] = 0; break;
9071
9072 default:
9073 return gl::error(GL_INVALID_ENUM);
9074 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009076 }
9077 catch(std::bad_alloc&)
9078 {
9079 return gl::error(GL_OUT_OF_MEMORY);
9080 }
9081}
9082
9083void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9084{
9085 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9086 target, index, data);
9087
9088 try
9089 {
9090 gl::Context *context = gl::getNonLostContext();
9091
9092 if (context)
9093 {
9094 if (context->getClientVersion() < 3)
9095 {
9096 return gl::error(GL_INVALID_OPERATION);
9097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009098
Shannon Woods15934d52013-08-19 14:28:49 -04009099 switch (target)
9100 {
9101 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9102 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9103 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9104 if (index >= context->getMaxTransformFeedbackBufferBindings())
9105 return gl::error(GL_INVALID_VALUE);
9106 break;
9107 case GL_UNIFORM_BUFFER_START:
9108 case GL_UNIFORM_BUFFER_SIZE:
9109 case GL_UNIFORM_BUFFER_BINDING:
9110 if (index >= context->getMaximumCombinedUniformBufferBindings())
9111 return gl::error(GL_INVALID_VALUE);
9112 break;
9113 default:
9114 return gl::error(GL_INVALID_ENUM);
9115 }
9116
9117 if (!(context->getIndexedInteger64v(target, index, data)))
9118 {
9119 GLenum nativeType;
9120 unsigned int numParams = 0;
9121 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9122 return gl::error(GL_INVALID_ENUM);
9123
9124 if (numParams == 0)
9125 return; // it is known that pname is valid, but there are no parameters to return
9126
9127 if (nativeType == GL_INT)
9128 {
9129 GLint *intParams = new GLint[numParams];
9130
9131 context->getIndexedIntegerv(target, index, intParams);
9132
9133 for (unsigned int i = 0; i < numParams; ++i)
9134 {
9135 data[i] = static_cast<GLint64>(intParams[i]);
9136 }
9137
9138 delete [] intParams;
9139 }
9140 else
9141 {
9142 UNREACHABLE();
9143 }
9144 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009145 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009146 }
9147 catch(std::bad_alloc&)
9148 {
9149 return gl::error(GL_OUT_OF_MEMORY);
9150 }
9151}
9152
9153void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9154{
9155 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9156 target, pname, params);
9157
9158 try
9159 {
9160 gl::Context *context = gl::getNonLostContext();
9161
9162 if (context)
9163 {
9164 if (context->getClientVersion() < 3)
9165 {
9166 return gl::error(GL_INVALID_OPERATION);
9167 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009168
Jamie Madill70656a62014-03-05 15:01:26 -05009169 if (!gl::ValidBufferTarget(context, target))
9170 {
9171 return gl::error(GL_INVALID_ENUM);
9172 }
9173
9174 if (!gl::ValidBufferParameter(context, pname))
9175 {
9176 return gl::error(GL_INVALID_ENUM);
9177 }
9178
9179 gl::Buffer *buffer = context->getTargetBuffer(target);
9180
9181 if (!buffer)
9182 {
9183 // A null buffer means that "0" is bound to the requested buffer target
9184 return gl::error(GL_INVALID_OPERATION);
9185 }
9186
9187 switch (pname)
9188 {
9189 case GL_BUFFER_USAGE:
9190 *params = static_cast<GLint64>(buffer->usage());
9191 break;
9192 case GL_BUFFER_SIZE:
9193 *params = buffer->size();
9194 break;
9195 case GL_BUFFER_ACCESS_FLAGS:
9196 *params = static_cast<GLint64>(buffer->accessFlags());
9197 break;
9198 case GL_BUFFER_MAPPED:
9199 *params = static_cast<GLint64>(buffer->mapped());
9200 break;
9201 case GL_BUFFER_MAP_OFFSET:
9202 *params = buffer->mapOffset();
9203 break;
9204 case GL_BUFFER_MAP_LENGTH:
9205 *params = buffer->mapLength();
9206 break;
9207 default: UNREACHABLE(); break;
9208 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009209 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009210 }
9211 catch(std::bad_alloc&)
9212 {
9213 return gl::error(GL_OUT_OF_MEMORY);
9214 }
9215}
9216
9217void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9218{
9219 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9220
9221 try
9222 {
9223 gl::Context *context = gl::getNonLostContext();
9224
9225 if (context)
9226 {
9227 if (context->getClientVersion() < 3)
9228 {
9229 return gl::error(GL_INVALID_OPERATION);
9230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009231
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009232 if (count < 0)
9233 {
9234 return gl::error(GL_INVALID_VALUE);
9235 }
9236
9237 for (int i = 0; i < count; i++)
9238 {
9239 samplers[i] = context->createSampler();
9240 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009241 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009242 }
9243 catch(std::bad_alloc&)
9244 {
9245 return gl::error(GL_OUT_OF_MEMORY);
9246 }
9247}
9248
9249void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9250{
9251 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9252
9253 try
9254 {
9255 gl::Context *context = gl::getNonLostContext();
9256
9257 if (context)
9258 {
9259 if (context->getClientVersion() < 3)
9260 {
9261 return gl::error(GL_INVALID_OPERATION);
9262 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009263
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009264 if (count < 0)
9265 {
9266 return gl::error(GL_INVALID_VALUE);
9267 }
9268
9269 for (int i = 0; i < count; i++)
9270 {
9271 context->deleteSampler(samplers[i]);
9272 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009274 }
9275 catch(std::bad_alloc&)
9276 {
9277 return gl::error(GL_OUT_OF_MEMORY);
9278 }
9279}
9280
9281GLboolean __stdcall glIsSampler(GLuint sampler)
9282{
9283 EVENT("(GLuint sampler = %u)", sampler);
9284
9285 try
9286 {
9287 gl::Context *context = gl::getNonLostContext();
9288
9289 if (context)
9290 {
9291 if (context->getClientVersion() < 3)
9292 {
9293 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9294 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009295
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009296 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009298 }
9299 catch(std::bad_alloc&)
9300 {
9301 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9302 }
9303
9304 return GL_FALSE;
9305}
9306
9307void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9308{
9309 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9310
9311 try
9312 {
9313 gl::Context *context = gl::getNonLostContext();
9314
9315 if (context)
9316 {
9317 if (context->getClientVersion() < 3)
9318 {
9319 return gl::error(GL_INVALID_OPERATION);
9320 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009321
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009322 if (sampler != 0 && !context->isSampler(sampler))
9323 {
9324 return gl::error(GL_INVALID_OPERATION);
9325 }
9326
9327 if (unit >= context->getMaximumCombinedTextureImageUnits())
9328 {
9329 return gl::error(GL_INVALID_VALUE);
9330 }
9331
9332 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009334 }
9335 catch(std::bad_alloc&)
9336 {
9337 return gl::error(GL_OUT_OF_MEMORY);
9338 }
9339}
9340
9341void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9342{
9343 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9344
9345 try
9346 {
9347 gl::Context *context = gl::getNonLostContext();
9348
9349 if (context)
9350 {
9351 if (context->getClientVersion() < 3)
9352 {
9353 return gl::error(GL_INVALID_OPERATION);
9354 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009355
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009356 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009357 {
9358 return;
9359 }
9360
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009361 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009362 {
9363 return;
9364 }
9365
9366 if (!context->isSampler(sampler))
9367 {
9368 return gl::error(GL_INVALID_OPERATION);
9369 }
9370
9371 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009373 }
9374 catch(std::bad_alloc&)
9375 {
9376 return gl::error(GL_OUT_OF_MEMORY);
9377 }
9378}
9379
9380void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9381{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009382 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009383}
9384
9385void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9386{
9387 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9388
9389 try
9390 {
9391 gl::Context *context = gl::getNonLostContext();
9392
9393 if (context)
9394 {
9395 if (context->getClientVersion() < 3)
9396 {
9397 return gl::error(GL_INVALID_OPERATION);
9398 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009399
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009400 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009401 {
9402 return;
9403 }
9404
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009405 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009406 {
9407 return;
9408 }
9409
9410 if (!context->isSampler(sampler))
9411 {
9412 return gl::error(GL_INVALID_OPERATION);
9413 }
9414
9415 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009417 }
9418 catch(std::bad_alloc&)
9419 {
9420 return gl::error(GL_OUT_OF_MEMORY);
9421 }
9422}
9423
9424void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9425{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009426 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009427}
9428
9429void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9430{
9431 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9432
9433 try
9434 {
9435 gl::Context *context = gl::getNonLostContext();
9436
9437 if (context)
9438 {
9439 if (context->getClientVersion() < 3)
9440 {
9441 return gl::error(GL_INVALID_OPERATION);
9442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009443
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009444 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009445 {
9446 return;
9447 }
9448
9449 if (!context->isSampler(sampler))
9450 {
9451 return gl::error(GL_INVALID_OPERATION);
9452 }
9453
9454 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009456 }
9457 catch(std::bad_alloc&)
9458 {
9459 return gl::error(GL_OUT_OF_MEMORY);
9460 }
9461}
9462
9463void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9464{
9465 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9466
9467 try
9468 {
9469 gl::Context *context = gl::getNonLostContext();
9470
9471 if (context)
9472 {
9473 if (context->getClientVersion() < 3)
9474 {
9475 return gl::error(GL_INVALID_OPERATION);
9476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009477
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009478 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009479 {
9480 return;
9481 }
9482
9483 if (!context->isSampler(sampler))
9484 {
9485 return gl::error(GL_INVALID_OPERATION);
9486 }
9487
9488 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009489 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009490 }
9491 catch(std::bad_alloc&)
9492 {
9493 return gl::error(GL_OUT_OF_MEMORY);
9494 }
9495}
9496
9497void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9498{
9499 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9500
9501 try
9502 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009503 if (index >= gl::MAX_VERTEX_ATTRIBS)
9504 {
9505 return gl::error(GL_INVALID_VALUE);
9506 }
9507
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009508 gl::Context *context = gl::getNonLostContext();
9509
9510 if (context)
9511 {
9512 if (context->getClientVersion() < 3)
9513 {
9514 return gl::error(GL_INVALID_OPERATION);
9515 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009516
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009517 context->setVertexAttribDivisor(index, divisor);
9518 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009519 }
9520 catch(std::bad_alloc&)
9521 {
9522 return gl::error(GL_OUT_OF_MEMORY);
9523 }
9524}
9525
9526void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9527{
9528 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9529
9530 try
9531 {
9532 gl::Context *context = gl::getNonLostContext();
9533
9534 if (context)
9535 {
9536 if (context->getClientVersion() < 3)
9537 {
9538 return gl::error(GL_INVALID_OPERATION);
9539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009540
Geoff Langc8058452014-02-03 12:04:11 -05009541 switch (target)
9542 {
9543 case GL_TRANSFORM_FEEDBACK:
9544 {
9545 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9546 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9547 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9548 {
9549 return gl::error(GL_INVALID_OPERATION);
9550 }
9551
9552 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9553 if (context->getTransformFeedback(id) == NULL)
9554 {
9555 return gl::error(GL_INVALID_OPERATION);
9556 }
9557
9558 context->bindTransformFeedback(id);
9559 }
9560 break;
9561
9562 default:
9563 return gl::error(GL_INVALID_ENUM);
9564 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009565 }
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 glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9574{
9575 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
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 for (int i = 0; i < n; i++)
9589 {
9590 context->deleteTransformFeedback(ids[i]);
9591 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009593 }
9594 catch(std::bad_alloc&)
9595 {
9596 return gl::error(GL_OUT_OF_MEMORY);
9597 }
9598}
9599
9600void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9601{
9602 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9603
9604 try
9605 {
9606 gl::Context *context = gl::getNonLostContext();
9607
9608 if (context)
9609 {
9610 if (context->getClientVersion() < 3)
9611 {
9612 return gl::error(GL_INVALID_OPERATION);
9613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009614
Geoff Langc8058452014-02-03 12:04:11 -05009615 for (int i = 0; i < n; i++)
9616 {
9617 ids[i] = context->createTransformFeedback();
9618 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009619 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009620 }
9621 catch(std::bad_alloc&)
9622 {
9623 return gl::error(GL_OUT_OF_MEMORY);
9624 }
9625}
9626
9627GLboolean __stdcall glIsTransformFeedback(GLuint id)
9628{
9629 EVENT("(GLuint id = %u)", id);
9630
9631 try
9632 {
9633 gl::Context *context = gl::getNonLostContext();
9634
9635 if (context)
9636 {
9637 if (context->getClientVersion() < 3)
9638 {
9639 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9640 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009641
Geoff Langc8058452014-02-03 12:04:11 -05009642 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009643 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009644 }
9645 catch(std::bad_alloc&)
9646 {
9647 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9648 }
9649
9650 return GL_FALSE;
9651}
9652
9653void __stdcall glPauseTransformFeedback(void)
9654{
9655 EVENT("(void)");
9656
9657 try
9658 {
9659 gl::Context *context = gl::getNonLostContext();
9660
9661 if (context)
9662 {
9663 if (context->getClientVersion() < 3)
9664 {
9665 return gl::error(GL_INVALID_OPERATION);
9666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009667
Geoff Langc8058452014-02-03 12:04:11 -05009668 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9669 ASSERT(transformFeedback != NULL);
9670
9671 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9672 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9673 {
9674 return gl::error(GL_INVALID_OPERATION);
9675 }
9676
9677 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009679 }
9680 catch(std::bad_alloc&)
9681 {
9682 return gl::error(GL_OUT_OF_MEMORY);
9683 }
9684}
9685
9686void __stdcall glResumeTransformFeedback(void)
9687{
9688 EVENT("(void)");
9689
9690 try
9691 {
9692 gl::Context *context = gl::getNonLostContext();
9693
9694 if (context)
9695 {
9696 if (context->getClientVersion() < 3)
9697 {
9698 return gl::error(GL_INVALID_OPERATION);
9699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009700
Geoff Langc8058452014-02-03 12:04:11 -05009701 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9702 ASSERT(transformFeedback != NULL);
9703
9704 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9705 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9706 {
9707 return gl::error(GL_INVALID_OPERATION);
9708 }
9709
9710 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009712 }
9713 catch(std::bad_alloc&)
9714 {
9715 return gl::error(GL_OUT_OF_MEMORY);
9716 }
9717}
9718
9719void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9720{
9721 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9722 program, bufSize, length, binaryFormat, binary);
9723
9724 try
9725 {
9726 gl::Context *context = gl::getNonLostContext();
9727
9728 if (context)
9729 {
9730 if (context->getClientVersion() < 3)
9731 {
9732 return gl::error(GL_INVALID_OPERATION);
9733 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009734
Jamie Madill54133512013-06-21 09:33:07 -04009735 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009736 UNIMPLEMENTED();
9737 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009738 }
9739 catch(std::bad_alloc&)
9740 {
9741 return gl::error(GL_OUT_OF_MEMORY);
9742 }
9743}
9744
9745void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9746{
9747 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9748 program, binaryFormat, binary, length);
9749
9750 try
9751 {
9752 gl::Context *context = gl::getNonLostContext();
9753
9754 if (context)
9755 {
9756 if (context->getClientVersion() < 3)
9757 {
9758 return gl::error(GL_INVALID_OPERATION);
9759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009760
Jamie Madill54133512013-06-21 09:33:07 -04009761 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009762 UNIMPLEMENTED();
9763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009764 }
9765 catch(std::bad_alloc&)
9766 {
9767 return gl::error(GL_OUT_OF_MEMORY);
9768 }
9769}
9770
9771void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9772{
9773 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9774 program, pname, value);
9775
9776 try
9777 {
9778 gl::Context *context = gl::getNonLostContext();
9779
9780 if (context)
9781 {
9782 if (context->getClientVersion() < 3)
9783 {
9784 return gl::error(GL_INVALID_OPERATION);
9785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009786
Jamie Madill54133512013-06-21 09:33:07 -04009787 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009788 UNIMPLEMENTED();
9789 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009790 }
9791 catch(std::bad_alloc&)
9792 {
9793 return gl::error(GL_OUT_OF_MEMORY);
9794 }
9795}
9796
9797void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9798{
9799 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9800 target, numAttachments, attachments);
9801
9802 try
9803 {
9804 gl::Context *context = gl::getNonLostContext();
9805
9806 if (context)
9807 {
9808 if (context->getClientVersion() < 3)
9809 {
9810 return gl::error(GL_INVALID_OPERATION);
9811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009812
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009813 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009814 {
9815 return;
9816 }
9817
9818 int maxDimension = context->getMaximumRenderbufferDimension();
9819 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009821 }
9822 catch(std::bad_alloc&)
9823 {
9824 return gl::error(GL_OUT_OF_MEMORY);
9825 }
9826}
9827
9828void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9829{
9830 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9831 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9832 target, numAttachments, attachments, x, y, width, height);
9833
9834 try
9835 {
9836 gl::Context *context = gl::getNonLostContext();
9837
9838 if (context)
9839 {
9840 if (context->getClientVersion() < 3)
9841 {
9842 return gl::error(GL_INVALID_OPERATION);
9843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009844
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009845 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009846 {
9847 return;
9848 }
9849
9850 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9851 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009852 }
9853 catch(std::bad_alloc&)
9854 {
9855 return gl::error(GL_OUT_OF_MEMORY);
9856 }
9857}
9858
9859void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9860{
9861 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9862 target, levels, internalformat, width, height);
9863
9864 try
9865 {
9866 gl::Context *context = gl::getNonLostContext();
9867
9868 if (context)
9869 {
9870 if (context->getClientVersion() < 3)
9871 {
9872 return gl::error(GL_INVALID_OPERATION);
9873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009874
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009875 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009876 {
9877 return;
9878 }
9879
9880 switch (target)
9881 {
9882 case GL_TEXTURE_2D:
9883 {
9884 gl::Texture2D *texture2d = context->getTexture2D();
9885 texture2d->storage(levels, internalformat, width, height);
9886 }
9887 break;
9888
Geoff Lang01c21d22013-09-24 11:52:16 -04009889 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009890 {
9891 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9892 textureCube->storage(levels, internalformat, width);
9893 }
9894 break;
9895
9896 default:
9897 return gl::error(GL_INVALID_ENUM);
9898 }
9899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009900 }
9901 catch(std::bad_alloc&)
9902 {
9903 return gl::error(GL_OUT_OF_MEMORY);
9904 }
9905}
9906
9907void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9908{
9909 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9910 "GLsizei height = %d, GLsizei depth = %d)",
9911 target, levels, internalformat, width, height, depth);
9912
9913 try
9914 {
9915 gl::Context *context = gl::getNonLostContext();
9916
9917 if (context)
9918 {
9919 if (context->getClientVersion() < 3)
9920 {
9921 return gl::error(GL_INVALID_OPERATION);
9922 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009923
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009924 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009925 {
9926 return;
9927 }
9928
9929 switch (target)
9930 {
9931 case GL_TEXTURE_3D:
9932 {
9933 gl::Texture3D *texture3d = context->getTexture3D();
9934 texture3d->storage(levels, internalformat, width, height, depth);
9935 }
9936 break;
9937
9938 case GL_TEXTURE_2D_ARRAY:
9939 {
9940 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9941 texture2darray->storage(levels, internalformat, width, height, depth);
9942 }
9943 break;
9944
9945 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009946 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009947 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009949 }
9950 catch(std::bad_alloc&)
9951 {
9952 return gl::error(GL_OUT_OF_MEMORY);
9953 }
9954}
9955
9956void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9957{
9958 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9959 "GLint* params = 0x%0.8p)",
9960 target, internalformat, pname, bufSize, params);
9961
9962 try
9963 {
9964 gl::Context *context = gl::getNonLostContext();
9965
9966 if (context)
9967 {
9968 if (context->getClientVersion() < 3)
9969 {
9970 return gl::error(GL_INVALID_OPERATION);
9971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009972
Shannon Woods809d2502013-07-08 10:32:18 -04009973 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9974 !gl::IsDepthRenderingSupported(internalformat, context) &&
9975 !gl::IsStencilRenderingSupported(internalformat, context))
9976 {
9977 return gl::error(GL_INVALID_ENUM);
9978 }
9979
9980 if (target != GL_RENDERBUFFER)
9981 {
9982 return gl::error(GL_INVALID_ENUM);
9983 }
9984
9985 if (bufSize < 0)
9986 {
9987 return gl::error(GL_INVALID_VALUE);
9988 }
9989
9990 switch (pname)
9991 {
9992 case GL_NUM_SAMPLE_COUNTS:
9993 if (bufSize != 0)
9994 *params = context->getNumSampleCounts(internalformat);
9995 break;
9996 case GL_SAMPLES:
9997 context->getSampleCounts(internalformat, bufSize, params);
9998 break;
9999 default:
10000 return gl::error(GL_INVALID_ENUM);
10001 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010003 }
10004 catch(std::bad_alloc&)
10005 {
10006 return gl::error(GL_OUT_OF_MEMORY);
10007 }
10008}
10009
10010// Extension functions
10011
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010012void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10013 GLbitfield mask, GLenum filter)
10014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010015 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010016 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10017 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10018 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10019
10020 try
10021 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010022 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010023
10024 if (context)
10025 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010026 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010027 dstX0, dstY0, dstX1, dstY1, mask, filter,
10028 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010029 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010030 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010031 }
10032
Geoff Lang758d5b22013-06-11 11:42:50 -040010033 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10034 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010035 }
10036 }
10037 catch(std::bad_alloc&)
10038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010040 }
10041}
10042
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010043void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10044 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010046 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010047 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010048 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010049 target, level, internalformat, width, height, depth, border, format, type, pixels);
10050
10051 try
10052 {
10053 UNIMPLEMENTED(); // FIXME
10054 }
10055 catch(std::bad_alloc&)
10056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010058 }
10059}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010060
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010061void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10062 GLenum *binaryFormat, void *binary)
10063{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010064 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 +000010065 program, bufSize, length, binaryFormat, binary);
10066
10067 try
10068 {
10069 gl::Context *context = gl::getNonLostContext();
10070
10071 if (context)
10072 {
10073 gl::Program *programObject = context->getProgram(program);
10074
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010075 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010077 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010078 }
10079
10080 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10081
10082 if (!programBinary)
10083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010084 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010085 }
10086
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010087 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010089 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010090 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010091
10092 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010093 }
10094 }
10095 catch(std::bad_alloc&)
10096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010097 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010098 }
10099}
10100
10101void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10102 const void *binary, GLint length)
10103{
10104 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10105 program, binaryFormat, binary, length);
10106
10107 try
10108 {
10109 gl::Context *context = gl::getNonLostContext();
10110
10111 if (context)
10112 {
10113 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010115 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010116 }
10117
10118 gl::Program *programObject = context->getProgram(program);
10119
10120 if (!programObject)
10121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010122 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010123 }
10124
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010125 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010126 }
10127 }
10128 catch(std::bad_alloc&)
10129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010130 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010131 }
10132}
10133
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010134void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10135{
10136 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10137
10138 try
10139 {
10140 gl::Context *context = gl::getNonLostContext();
10141
10142 if (context)
10143 {
10144 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10145 {
10146 return gl::error(GL_INVALID_VALUE);
10147 }
10148
10149 if (context->getDrawFramebufferHandle() == 0)
10150 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010151 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010152 {
10153 return gl::error(GL_INVALID_OPERATION);
10154 }
10155
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010156 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010157 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010158 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010159 }
10160 }
10161 else
10162 {
10163 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10164 {
10165 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10166 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10167 {
10168 return gl::error(GL_INVALID_OPERATION);
10169 }
10170 }
10171 }
10172
10173 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10174
10175 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10176 {
10177 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10178 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010179
10180 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10181 {
10182 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10183 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010184 }
10185 }
10186 catch (std::bad_alloc&)
10187 {
10188 return gl::error(GL_OUT_OF_MEMORY);
10189 }
10190}
10191
Shannon Woodsb3801742014-03-27 14:59:19 -040010192void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
10193{
10194 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
10195
10196 try
10197 {
10198 gl::Context *context = gl::getNonLostContext();
10199
10200 if (context)
10201 {
10202 if (!context->supportsPBOs())
10203 {
10204 return gl::error(GL_INVALID_OPERATION);
10205 }
10206
10207 if (!gl::ValidBufferTarget(context, target))
10208 {
10209 return gl::error(GL_INVALID_ENUM);
10210 }
10211
10212 if (pname != GL_BUFFER_MAP_POINTER)
10213 {
10214 return gl::error(GL_INVALID_ENUM);
10215 }
10216
10217 gl::Buffer *buffer = context->getTargetBuffer(target);
10218
10219 if (!buffer || !buffer->mapped())
10220 {
10221 *params = NULL;
10222 }
10223
10224 *params = buffer->mapPointer();
10225 }
10226 }
10227 catch (std::bad_alloc&)
10228 {
10229 return gl::error(GL_OUT_OF_MEMORY);
10230 }
10231}
10232
10233void * __stdcall glMapBufferOES(GLenum target, GLenum access)
10234{
10235 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
10236
10237 try
10238 {
10239 gl::Context *context = gl::getNonLostContext();
10240
10241 if (context)
10242 {
10243 if (!gl::ValidBufferTarget(context, target))
10244 {
10245 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10246 }
10247
10248 gl::Buffer *buffer = context->getTargetBuffer(target);
10249
10250 if (buffer == NULL)
10251 {
10252 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10253 }
10254
10255 if (access != GL_WRITE_ONLY_OES)
10256 {
10257 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10258 }
10259
10260 if (buffer->mapped())
10261 {
10262 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10263 }
10264
10265 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10266 }
10267 }
10268 catch(std::bad_alloc&)
10269 {
10270 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10271 }
10272
10273 return NULL;
10274}
10275
10276GLboolean __stdcall glUnmapBufferOES(GLenum target)
10277{
10278 EVENT("(GLenum target = 0x%X)", target);
10279
10280 try
10281 {
10282 gl::Context *context = gl::getNonLostContext();
10283
10284 if (context)
10285 {
10286 if (!gl::ValidBufferTarget(context, target))
10287 {
10288 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10289 }
10290
10291 gl::Buffer *buffer = context->getTargetBuffer(target);
10292
10293 if (buffer == NULL || !buffer->mapped())
10294 {
10295 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10296 }
10297
10298 // TODO: detect if we had corruption. if so, throw an error and return false.
10299
10300 buffer->unmap();
10301
10302 return GL_TRUE;
10303 }
10304 }
10305 catch(std::bad_alloc&)
10306 {
10307 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10308 }
10309
10310 return GL_FALSE;
10311}
10312
Shannon Woods916e7692014-03-27 16:58:22 -040010313void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10314{
10315 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10316 target, offset, length, access);
10317
10318 try
10319 {
10320 gl::Context *context = gl::getNonLostContext();
10321
10322 if (context)
10323 {
10324 if (!gl::ValidBufferTarget(context, target))
10325 {
10326 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10327 }
10328
10329 if (offset < 0 || length < 0)
10330 {
10331 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10332 }
10333
10334 gl::Buffer *buffer = context->getTargetBuffer(target);
10335
10336 if (buffer == NULL)
10337 {
10338 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10339 }
10340
10341 // Check for buffer overflow
10342 size_t offsetSize = static_cast<size_t>(offset);
10343 size_t lengthSize = static_cast<size_t>(length);
10344
10345 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10346 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10347 {
10348 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10349 }
10350
10351 // Check for invalid bits in the mask
10352 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10353 GL_MAP_WRITE_BIT |
10354 GL_MAP_INVALIDATE_RANGE_BIT |
10355 GL_MAP_INVALIDATE_BUFFER_BIT |
10356 GL_MAP_FLUSH_EXPLICIT_BIT |
10357 GL_MAP_UNSYNCHRONIZED_BIT;
10358
10359 if (access & ~(allAccessBits))
10360 {
10361 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10362 }
10363
10364 if (length == 0 || buffer->mapped())
10365 {
10366 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10367 }
10368
10369 // Check for invalid bit combinations
10370 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10371 {
10372 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10373 }
10374
10375 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10376 GL_MAP_INVALIDATE_BUFFER_BIT |
10377 GL_MAP_UNSYNCHRONIZED_BIT;
10378
10379 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10380 {
10381 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10382 }
10383
10384 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10385 {
10386 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10387 }
10388
10389 return buffer->mapRange(offset, length, access);
10390 }
10391 }
10392 catch(std::bad_alloc&)
10393 {
10394 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10395 }
10396
10397 return NULL;
10398}
10399
10400void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10401{
10402 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10403
10404 try
10405 {
10406 gl::Context *context = gl::getNonLostContext();
10407
10408 if (context)
10409 {
10410 if (offset < 0 || length < 0)
10411 {
10412 return gl::error(GL_INVALID_VALUE);
10413 }
10414
10415 if (!gl::ValidBufferTarget(context, target))
10416 {
10417 return gl::error(GL_INVALID_ENUM);
10418 }
10419
10420 gl::Buffer *buffer = context->getTargetBuffer(target);
10421
10422 if (buffer == NULL)
10423 {
10424 return gl::error(GL_INVALID_OPERATION);
10425 }
10426
10427 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10428 {
10429 return gl::error(GL_INVALID_OPERATION);
10430 }
10431
10432 // Check for buffer overflow
10433 size_t offsetSize = static_cast<size_t>(offset);
10434 size_t lengthSize = static_cast<size_t>(length);
10435
10436 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10437 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10438 {
10439 return gl::error(GL_INVALID_VALUE);
10440 }
10441
10442 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10443 }
10444 }
10445 catch(std::bad_alloc&)
10446 {
10447 return gl::error(GL_OUT_OF_MEMORY);
10448 }
10449}
10450
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010451__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10452{
10453 struct Extension
10454 {
10455 const char *name;
10456 __eglMustCastToProperFunctionPointerType address;
10457 };
10458
10459 static const Extension glExtensions[] =
10460 {
10461 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010462 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010463 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010464 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10465 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10466 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10467 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10468 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10469 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10470 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010471 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010472 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010473 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10474 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10475 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10476 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010477 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10478 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10479 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10480 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10481 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10482 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10483 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010484 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010485 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10486 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10487 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010488 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010489 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10490 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10491 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010492 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10493 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10494 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010495
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010496 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010497 {
10498 if (strcmp(procname, glExtensions[ext].name) == 0)
10499 {
10500 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10501 }
10502 }
10503
10504 return NULL;
10505}
10506
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010507// Non-public functions used by EGL
10508
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010509bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010510{
10511 EVENT("(egl::Surface* surface = 0x%0.8p)",
10512 surface);
10513
10514 try
10515 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010516 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010517
10518 if (context)
10519 {
10520 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010521 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010522
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010523 if (textureObject->isImmutable())
10524 {
10525 return false;
10526 }
10527
Geoff Lang32d508e2014-02-11 09:39:48 -050010528 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010529 }
10530 }
10531 catch(std::bad_alloc&)
10532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010533 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010534 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010535
10536 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010537}
10538
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010539}