blob: b0a3d06f98c19dda3f23cb8974f4774a29259526 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
55 catch(std::bad_alloc&)
56 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
104 catch(std::bad_alloc&)
105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Geoff Lang37dde692014-01-31 16:34:54 -0500120 if (!ValidQueryType(context, target))
121 {
122 return gl::error(GL_INVALID_ENUM);
123 }
124
125 if (id == 0)
126 {
127 return gl::error(GL_INVALID_OPERATION);
128 }
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130 context->beginQuery(target, id);
131 }
132 }
133 catch(std::bad_alloc&)
134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000136 }
137}
138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000139void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142
143 try
144 {
145 if (index >= gl::MAX_VERTEX_ATTRIBS)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 if (context)
153 {
154 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156 if (!programObject)
157 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 if (context->getShader(program))
159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000160 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 }
162 else
163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000165 }
166 }
167
168 if (strncmp(name, "gl_", 3) == 0)
169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171 }
172
173 programObject->bindAttributeLocation(index, name);
174 }
175 }
176 catch(std::bad_alloc&)
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179 }
180}
181
182void __stdcall glBindBuffer(GLenum target, GLuint buffer)
183{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000184 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
186 try
187 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189
190 if (context)
191 {
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:
3005 return gl::error(GL_INVALID_ENUM);
3006 }
3007 }
3008
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003009 switch (pname)
3010 {
3011 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003012 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 return;
3014 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003015 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 return;
3017 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003018 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 return;
3020 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003021 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022 return;
3023 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003024 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 return;
3026 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003027 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 return;
3029 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003030 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 return;
3032 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003033 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 return;
3035 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003036 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003038 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003039 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003040 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003041 case GL_ACTIVE_UNIFORM_BLOCKS:
3042 *params = programObject->getActiveUniformBlockCount();
3043 return;
3044 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3045 *params = programObject->getActiveUniformBlockMaxLength();
3046 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003047 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003048 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003049 }
3050 }
3051 }
3052 catch(std::bad_alloc&)
3053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003054 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 }
3056}
3057
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003058void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003060 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 +00003061 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003062
3063 try
3064 {
3065 if (bufsize < 0)
3066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003067 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003068 }
3069
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003071
3072 if (context)
3073 {
3074 gl::Program *programObject = context->getProgram(program);
3075
3076 if (!programObject)
3077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003078 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003079 }
3080
3081 programObject->getInfoLog(bufsize, length, infolog);
3082 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003083 }
3084 catch(std::bad_alloc&)
3085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003086 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003087 }
3088}
3089
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003090void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3091{
3092 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3093
3094 try
3095 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003096 gl::Context *context = gl::getNonLostContext();
3097
3098 if (context)
3099 {
Geoff Lang37dde692014-01-31 16:34:54 -05003100 if (!ValidQueryType(context, target))
3101 {
3102 return gl::error(GL_INVALID_ENUM);
3103 }
3104
3105 switch (pname)
3106 {
3107 case GL_CURRENT_QUERY_EXT:
3108 params[0] = context->getActiveQuery(target);
3109 break;
3110
3111 default:
3112 return gl::error(GL_INVALID_ENUM);
3113 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003114 }
3115 }
3116 catch(std::bad_alloc&)
3117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003118 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003119 }
3120}
3121
3122void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3123{
3124 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3125
3126 try
3127 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003128 gl::Context *context = gl::getNonLostContext();
3129
3130 if (context)
3131 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003132 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3133
3134 if (!queryObject)
3135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003137 }
3138
3139 if (context->getActiveQuery(queryObject->getType()) == id)
3140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003141 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003142 }
3143
3144 switch(pname)
3145 {
3146 case GL_QUERY_RESULT_EXT:
3147 params[0] = queryObject->getResult();
3148 break;
3149 case GL_QUERY_RESULT_AVAILABLE_EXT:
3150 params[0] = queryObject->isResultAvailable();
3151 break;
3152 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003153 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003154 }
3155 }
3156 }
3157 catch(std::bad_alloc&)
3158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003160 }
3161}
3162
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003163void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003165 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 +00003166
3167 try
3168 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003170
3171 if (context)
3172 {
3173 if (target != GL_RENDERBUFFER)
3174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003175 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003176 }
3177
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003178 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003180 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003181 }
3182
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003183 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003184
3185 switch (pname)
3186 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003187 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3188 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3189 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3190 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3191 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3192 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3193 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3194 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3195 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003196 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003197 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003198 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003199 *params = renderbuffer->getSamples();
3200 }
3201 else
3202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003203 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003204 }
3205 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003206 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003207 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003208 }
3209 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003210 }
3211 catch(std::bad_alloc&)
3212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003213 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003214 }
3215}
3216
3217void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003219 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003220
3221 try
3222 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224
3225 if (context)
3226 {
3227 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003228
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003229 if (!shaderObject)
3230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003231 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232 }
3233
3234 switch (pname)
3235 {
3236 case GL_SHADER_TYPE:
3237 *params = shaderObject->getType();
3238 return;
3239 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003240 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241 return;
3242 case GL_COMPILE_STATUS:
3243 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3244 return;
3245 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003246 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003247 return;
3248 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003249 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003251 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3252 *params = shaderObject->getTranslatedSourceLength();
3253 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003255 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003256 }
3257 }
3258 }
3259 catch(std::bad_alloc&)
3260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003261 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 }
3263}
3264
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003265void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003267 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 +00003268 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003269
3270 try
3271 {
3272 if (bufsize < 0)
3273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275 }
3276
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003278
3279 if (context)
3280 {
3281 gl::Shader *shaderObject = context->getShader(shader);
3282
3283 if (!shaderObject)
3284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003286 }
3287
3288 shaderObject->getInfoLog(bufsize, length, infolog);
3289 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290 }
3291 catch(std::bad_alloc&)
3292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003294 }
3295}
3296
3297void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003299 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 +00003300 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003301
3302 try
3303 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003304 switch (shadertype)
3305 {
3306 case GL_VERTEX_SHADER:
3307 case GL_FRAGMENT_SHADER:
3308 break;
3309 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003310 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003311 }
3312
3313 switch (precisiontype)
3314 {
3315 case GL_LOW_FLOAT:
3316 case GL_MEDIUM_FLOAT:
3317 case GL_HIGH_FLOAT:
3318 // Assume IEEE 754 precision
3319 range[0] = 127;
3320 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003321 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003322 break;
3323 case GL_LOW_INT:
3324 case GL_MEDIUM_INT:
3325 case GL_HIGH_INT:
3326 // Some (most) hardware only supports single-precision floating-point numbers,
3327 // which can accurately represent integers up to +/-16777216
3328 range[0] = 24;
3329 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003330 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003331 break;
3332 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003333 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003334 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003335 }
3336 catch(std::bad_alloc&)
3337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003339 }
3340}
3341
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003342void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003344 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 +00003345 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003346
3347 try
3348 {
3349 if (bufsize < 0)
3350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352 }
3353
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003355
3356 if (context)
3357 {
3358 gl::Shader *shaderObject = context->getShader(shader);
3359
3360 if (!shaderObject)
3361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003362 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003363 }
3364
3365 shaderObject->getSource(bufsize, length, source);
3366 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367 }
3368 catch(std::bad_alloc&)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 }
3372}
3373
zmo@google.coma574f782011-10-03 21:45:23 +00003374void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3375{
3376 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3377 shader, bufsize, length, source);
3378
3379 try
3380 {
3381 if (bufsize < 0)
3382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003383 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003384 }
3385
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003386 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003387
3388 if (context)
3389 {
3390 gl::Shader *shaderObject = context->getShader(shader);
3391
3392 if (!shaderObject)
3393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003395 }
3396
3397 shaderObject->getTranslatedSource(bufsize, length, source);
3398 }
3399 }
3400 catch(std::bad_alloc&)
3401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003402 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003403 }
3404}
3405
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406const GLubyte* __stdcall glGetString(GLenum name)
3407{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003408 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409
3410 try
3411 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003413
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003414 switch (name)
3415 {
3416 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003417 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003419 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003421 if (context->getClientVersion() == 2)
3422 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003423 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003424 }
3425 else
3426 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003427 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003428 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003429 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003430 if (context->getClientVersion() == 2)
3431 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003432 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003433 }
3434 else
3435 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003436 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003437 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003439 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003440 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003441 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442 }
3443 }
3444 catch(std::bad_alloc&)
3445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003446 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448}
3449
3450void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3451{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003452 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 +00003453
3454 try
3455 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003456 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003457
3458 if (context)
3459 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003460 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003461
Jamie Madillfb8a8302013-07-03 14:24:12 -04003462 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003465 }
3466
3467 switch (pname)
3468 {
3469 case GL_TEXTURE_MAG_FILTER:
3470 *params = (GLfloat)texture->getMagFilter();
3471 break;
3472 case GL_TEXTURE_MIN_FILTER:
3473 *params = (GLfloat)texture->getMinFilter();
3474 break;
3475 case GL_TEXTURE_WRAP_S:
3476 *params = (GLfloat)texture->getWrapS();
3477 break;
3478 case GL_TEXTURE_WRAP_T:
3479 *params = (GLfloat)texture->getWrapT();
3480 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003481 case GL_TEXTURE_WRAP_R:
3482 if (context->getClientVersion() < 3)
3483 {
3484 return gl::error(GL_INVALID_ENUM);
3485 }
3486 *params = (GLfloat)texture->getWrapR();
3487 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003488 case GL_TEXTURE_IMMUTABLE_FORMAT:
3489 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003490 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3491 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003492 case GL_TEXTURE_IMMUTABLE_LEVELS:
3493 if (context->getClientVersion() < 3)
3494 {
3495 return gl::error(GL_INVALID_ENUM);
3496 }
Jamie Madill51a94372013-10-24 17:49:43 -04003497 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003498 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003499 case GL_TEXTURE_USAGE_ANGLE:
3500 *params = (GLfloat)texture->getUsage();
3501 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003502 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3503 if (!context->supportsTextureFilterAnisotropy())
3504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003506 }
3507 *params = (GLfloat)texture->getMaxAnisotropy();
3508 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003509 case GL_TEXTURE_SWIZZLE_R:
3510 if (context->getClientVersion() < 3)
3511 {
3512 return gl::error(GL_INVALID_ENUM);
3513 }
3514 *params = (GLfloat)texture->getSwizzleRed();
3515 break;
3516 case GL_TEXTURE_SWIZZLE_G:
3517 if (context->getClientVersion() < 3)
3518 {
3519 return gl::error(GL_INVALID_ENUM);
3520 }
3521 *params = (GLfloat)texture->getSwizzleGreen();
3522 break;
3523 case GL_TEXTURE_SWIZZLE_B:
3524 if (context->getClientVersion() < 3)
3525 {
3526 return gl::error(GL_INVALID_ENUM);
3527 }
3528 *params = (GLfloat)texture->getSwizzleBlue();
3529 break;
3530 case GL_TEXTURE_SWIZZLE_A:
3531 if (context->getClientVersion() < 3)
3532 {
3533 return gl::error(GL_INVALID_ENUM);
3534 }
3535 *params = (GLfloat)texture->getSwizzleAlpha();
3536 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003537 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003539 }
3540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541 }
3542 catch(std::bad_alloc&)
3543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003545 }
3546}
3547
3548void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003550 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 +00003551
3552 try
3553 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003555
3556 if (context)
3557 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003558 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003559
Jamie Madillfb8a8302013-07-03 14:24:12 -04003560 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003562 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003563 }
3564
3565 switch (pname)
3566 {
3567 case GL_TEXTURE_MAG_FILTER:
3568 *params = texture->getMagFilter();
3569 break;
3570 case GL_TEXTURE_MIN_FILTER:
3571 *params = texture->getMinFilter();
3572 break;
3573 case GL_TEXTURE_WRAP_S:
3574 *params = texture->getWrapS();
3575 break;
3576 case GL_TEXTURE_WRAP_T:
3577 *params = texture->getWrapT();
3578 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003579 case GL_TEXTURE_WRAP_R:
3580 if (context->getClientVersion() < 3)
3581 {
3582 return gl::error(GL_INVALID_ENUM);
3583 }
3584 *params = texture->getWrapR();
3585 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003586 case GL_TEXTURE_IMMUTABLE_FORMAT:
3587 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003588 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3589 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003590 case GL_TEXTURE_IMMUTABLE_LEVELS:
3591 if (context->getClientVersion() < 3)
3592 {
3593 return gl::error(GL_INVALID_ENUM);
3594 }
Jamie Madill51a94372013-10-24 17:49:43 -04003595 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003596 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003597 case GL_TEXTURE_USAGE_ANGLE:
3598 *params = texture->getUsage();
3599 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003600 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3601 if (!context->supportsTextureFilterAnisotropy())
3602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003603 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003604 }
3605 *params = (GLint)texture->getMaxAnisotropy();
3606 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003607 case GL_TEXTURE_SWIZZLE_R:
3608 if (context->getClientVersion() < 3)
3609 {
3610 return gl::error(GL_INVALID_ENUM);
3611 }
3612 *params = texture->getSwizzleRed();
3613 break;
3614 case GL_TEXTURE_SWIZZLE_G:
3615 if (context->getClientVersion() < 3)
3616 {
3617 return gl::error(GL_INVALID_ENUM);
3618 }
3619 *params = texture->getSwizzleGreen();
3620 break;
3621 case GL_TEXTURE_SWIZZLE_B:
3622 if (context->getClientVersion() < 3)
3623 {
3624 return gl::error(GL_INVALID_ENUM);
3625 }
3626 *params = texture->getSwizzleBlue();
3627 break;
3628 case GL_TEXTURE_SWIZZLE_A:
3629 if (context->getClientVersion() < 3)
3630 {
3631 return gl::error(GL_INVALID_ENUM);
3632 }
3633 *params = texture->getSwizzleAlpha();
3634 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003635
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003636 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003638 }
3639 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003640 }
3641 catch(std::bad_alloc&)
3642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644 }
3645}
3646
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003647void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3648{
3649 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3650 program, location, bufSize, params);
3651
3652 try
3653 {
3654 if (bufSize < 0)
3655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003656 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003657 }
3658
3659 gl::Context *context = gl::getNonLostContext();
3660
3661 if (context)
3662 {
3663 if (program == 0)
3664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003666 }
3667
3668 gl::Program *programObject = context->getProgram(program);
3669
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003670 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003673 }
3674
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003675 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3676 if (!programBinary)
3677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003678 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003679 }
3680
3681 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003684 }
3685 }
3686 }
3687 catch(std::bad_alloc&)
3688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003690 }
3691}
3692
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003693void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003695 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003696
3697 try
3698 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003699 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003700
3701 if (context)
3702 {
3703 if (program == 0)
3704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003706 }
3707
3708 gl::Program *programObject = context->getProgram(program);
3709
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003710 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003712 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003713 }
3714
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003715 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3716 if (!programBinary)
3717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003718 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003719 }
3720
3721 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003723 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003724 }
3725 }
3726 }
3727 catch(std::bad_alloc&)
3728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003729 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003730 }
3731}
3732
3733void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3734{
3735 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3736 program, location, bufSize, params);
3737
3738 try
3739 {
3740 if (bufSize < 0)
3741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003742 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003743 }
3744
3745 gl::Context *context = gl::getNonLostContext();
3746
3747 if (context)
3748 {
3749 if (program == 0)
3750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003752 }
3753
3754 gl::Program *programObject = context->getProgram(program);
3755
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003756 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003758 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003759 }
3760
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003761 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3762 if (!programBinary)
3763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003764 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003765 }
3766
3767 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003770 }
3771 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003772 }
3773 catch(std::bad_alloc&)
3774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003776 }
3777}
3778
3779void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003781 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003782
3783 try
3784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003786
3787 if (context)
3788 {
3789 if (program == 0)
3790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003792 }
3793
3794 gl::Program *programObject = context->getProgram(program);
3795
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003796 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003797 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003798 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003799 }
3800
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003801 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3802 if (!programBinary)
3803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003804 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003805 }
3806
3807 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003809 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003810 }
3811 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 }
3813 catch(std::bad_alloc&)
3814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003815 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816 }
3817}
3818
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003819int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003821 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003822
3823 try
3824 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826
3827 if (strstr(name, "gl_") == name)
3828 {
3829 return -1;
3830 }
3831
3832 if (context)
3833 {
3834 gl::Program *programObject = context->getProgram(program);
3835
3836 if (!programObject)
3837 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003838 if (context->getShader(program))
3839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003840 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003841 }
3842 else
3843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003844 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003845 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003846 }
3847
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003848 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003849 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003851 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003852 }
3853
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003854 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855 }
3856 }
3857 catch(std::bad_alloc&)
3858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003859 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003860 }
3861
3862 return -1;
3863}
3864
3865void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003867 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868
3869 try
3870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872
daniel@transgaming.come0078962010-04-15 20:45:08 +00003873 if (context)
3874 {
3875 if (index >= gl::MAX_VERTEX_ATTRIBS)
3876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003877 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003878 }
3879
daniel@transgaming.com83921382011-01-08 05:46:00 +00003880 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003881
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003882 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003883 {
Jamie Madillaff71502013-07-02 11:57:05 -04003884 return;
3885 }
3886
3887 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3888 {
3889 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3890 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003891 {
Jamie Madillaff71502013-07-02 11:57:05 -04003892 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003893 }
Jamie Madillaff71502013-07-02 11:57:05 -04003894 }
3895 else
3896 {
3897 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003898 }
3899 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003900 }
3901 catch(std::bad_alloc&)
3902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003904 }
3905}
3906
3907void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3908{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003909 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910
3911 try
3912 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003913 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914
daniel@transgaming.come0078962010-04-15 20:45:08 +00003915 if (context)
3916 {
3917 if (index >= gl::MAX_VERTEX_ATTRIBS)
3918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003919 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003920 }
3921
daniel@transgaming.com83921382011-01-08 05:46:00 +00003922 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003923
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003924 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003925 {
Jamie Madillaff71502013-07-02 11:57:05 -04003926 return;
3927 }
3928
3929 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3930 {
3931 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3932 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003933 {
Jamie Madillaff71502013-07-02 11:57:05 -04003934 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003935 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003936 }
Jamie Madillaff71502013-07-02 11:57:05 -04003937 }
3938 else
3939 {
3940 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003941 }
3942 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003943 }
3944 catch(std::bad_alloc&)
3945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003946 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003947 }
3948}
3949
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003950void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003952 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003953
3954 try
3955 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003957
daniel@transgaming.come0078962010-04-15 20:45:08 +00003958 if (context)
3959 {
3960 if (index >= gl::MAX_VERTEX_ATTRIBS)
3961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003962 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003963 }
3964
3965 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003967 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003968 }
3969
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003970 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003971 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003972 }
3973 catch(std::bad_alloc&)
3974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003975 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003976 }
3977}
3978
3979void __stdcall glHint(GLenum target, GLenum mode)
3980{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003981 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003982
3983 try
3984 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003985 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003986 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003987 case GL_FASTEST:
3988 case GL_NICEST:
3989 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003990 break;
3991 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003992 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003993 }
3994
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003995 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003996 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003997 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003998 case GL_GENERATE_MIPMAP_HINT:
3999 if (context) context->setGenerateMipmapHint(mode);
4000 break;
4001 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4002 if (context) context->setFragmentShaderDerivativeHint(mode);
4003 break;
4004 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004005 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004006 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007 }
4008 catch(std::bad_alloc&)
4009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004010 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004011 }
4012}
4013
4014GLboolean __stdcall glIsBuffer(GLuint buffer)
4015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004016 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017
4018 try
4019 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021
4022 if (context && buffer)
4023 {
4024 gl::Buffer *bufferObject = context->getBuffer(buffer);
4025
4026 if (bufferObject)
4027 {
4028 return GL_TRUE;
4029 }
4030 }
4031 }
4032 catch(std::bad_alloc&)
4033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004034 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035 }
4036
4037 return GL_FALSE;
4038}
4039
4040GLboolean __stdcall glIsEnabled(GLenum cap)
4041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004042 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043
4044 try
4045 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047
4048 if (context)
4049 {
Geoff Lang0550d032014-01-30 11:29:07 -05004050 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004052 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004053 }
Geoff Lang0550d032014-01-30 11:29:07 -05004054
4055 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004056 }
4057 }
4058 catch(std::bad_alloc&)
4059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061 }
4062
4063 return false;
4064}
4065
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004066GLboolean __stdcall glIsFenceNV(GLuint fence)
4067{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004068 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004069
4070 try
4071 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004072 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004073
4074 if (context)
4075 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004076 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004077
4078 if (fenceObject == NULL)
4079 {
4080 return GL_FALSE;
4081 }
4082
4083 return fenceObject->isFence();
4084 }
4085 }
4086 catch(std::bad_alloc&)
4087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004088 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004089 }
4090
4091 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004092}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004093
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4095{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004096 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097
4098 try
4099 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004100 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101
4102 if (context && framebuffer)
4103 {
4104 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4105
4106 if (framebufferObject)
4107 {
4108 return GL_TRUE;
4109 }
4110 }
4111 }
4112 catch(std::bad_alloc&)
4113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004114 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115 }
4116
4117 return GL_FALSE;
4118}
4119
4120GLboolean __stdcall glIsProgram(GLuint program)
4121{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004122 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004123
4124 try
4125 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004126 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127
4128 if (context && program)
4129 {
4130 gl::Program *programObject = context->getProgram(program);
4131
4132 if (programObject)
4133 {
4134 return GL_TRUE;
4135 }
4136 }
4137 }
4138 catch(std::bad_alloc&)
4139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004140 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141 }
4142
4143 return GL_FALSE;
4144}
4145
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004146GLboolean __stdcall glIsQueryEXT(GLuint id)
4147{
4148 EVENT("(GLuint id = %d)", id);
4149
4150 try
4151 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004152 gl::Context *context = gl::getNonLostContext();
4153
4154 if (context)
4155 {
Geoff Lang37dde692014-01-31 16:34:54 -05004156 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004157 }
4158 }
4159 catch(std::bad_alloc&)
4160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004161 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004162 }
4163
4164 return GL_FALSE;
4165}
4166
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004167GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004169 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004170
4171 try
4172 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174
4175 if (context && renderbuffer)
4176 {
4177 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4178
4179 if (renderbufferObject)
4180 {
4181 return GL_TRUE;
4182 }
4183 }
4184 }
4185 catch(std::bad_alloc&)
4186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004187 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189
4190 return GL_FALSE;
4191}
4192
4193GLboolean __stdcall glIsShader(GLuint shader)
4194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004195 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196
4197 try
4198 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004199 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200
4201 if (context && shader)
4202 {
4203 gl::Shader *shaderObject = context->getShader(shader);
4204
4205 if (shaderObject)
4206 {
4207 return GL_TRUE;
4208 }
4209 }
4210 }
4211 catch(std::bad_alloc&)
4212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214 }
4215
4216 return GL_FALSE;
4217}
4218
4219GLboolean __stdcall glIsTexture(GLuint texture)
4220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004221 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222
4223 try
4224 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226
4227 if (context && texture)
4228 {
4229 gl::Texture *textureObject = context->getTexture(texture);
4230
4231 if (textureObject)
4232 {
4233 return GL_TRUE;
4234 }
4235 }
4236 }
4237 catch(std::bad_alloc&)
4238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004239 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240 }
4241
4242 return GL_FALSE;
4243}
4244
4245void __stdcall glLineWidth(GLfloat width)
4246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004247 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004248
4249 try
4250 {
4251 if (width <= 0.0f)
4252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004253 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004254 }
4255
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004257
4258 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004259 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004260 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 }
4262 }
4263 catch(std::bad_alloc&)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267}
4268
4269void __stdcall glLinkProgram(GLuint program)
4270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004271 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272
4273 try
4274 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276
4277 if (context)
4278 {
4279 gl::Program *programObject = context->getProgram(program);
4280
4281 if (!programObject)
4282 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004283 if (context->getShader(program))
4284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004286 }
4287 else
4288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004290 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291 }
4292
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004293 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294 }
4295 }
4296 catch(std::bad_alloc&)
4297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004298 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004299 }
4300}
4301
4302void __stdcall glPixelStorei(GLenum pname, GLint param)
4303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004304 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004305
4306 try
4307 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004308 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004309
4310 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004312 switch (pname)
4313 {
4314 case GL_UNPACK_ALIGNMENT:
4315 if (param != 1 && param != 2 && param != 4 && param != 8)
4316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004317 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004318 }
4319
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004320 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004321 break;
4322
4323 case GL_PACK_ALIGNMENT:
4324 if (param != 1 && param != 2 && param != 4 && param != 8)
4325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004327 }
4328
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004329 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004330 break;
4331
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004332 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4333 context->setPackReverseRowOrder(param != 0);
4334 break;
4335
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004336 case GL_UNPACK_IMAGE_HEIGHT:
4337 case GL_UNPACK_SKIP_IMAGES:
4338 case GL_UNPACK_ROW_LENGTH:
4339 case GL_UNPACK_SKIP_ROWS:
4340 case GL_UNPACK_SKIP_PIXELS:
4341 case GL_PACK_ROW_LENGTH:
4342 case GL_PACK_SKIP_ROWS:
4343 case GL_PACK_SKIP_PIXELS:
4344 if (context->getClientVersion() < 3)
4345 {
4346 return gl::error(GL_INVALID_ENUM);
4347 }
4348 UNIMPLEMENTED();
4349 break;
4350
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004351 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004352 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004353 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354 }
4355 }
4356 catch(std::bad_alloc&)
4357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360}
4361
4362void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004364 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365
4366 try
4367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004369
4370 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004372 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004373 }
4374 }
4375 catch(std::bad_alloc&)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378 }
4379}
4380
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004381void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4382 GLenum format, GLenum type, GLsizei bufSize,
4383 GLvoid *data)
4384{
4385 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4386 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4387 x, y, width, height, format, type, bufSize, data);
4388
4389 try
4390 {
4391 if (width < 0 || height < 0 || bufSize < 0)
4392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004394 }
4395
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004396 gl::Context *context = gl::getNonLostContext();
4397
4398 if (context)
4399 {
Jamie Madill26e91952014-03-05 15:01:27 -05004400 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4401 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004402 {
Jamie Madill26e91952014-03-05 15:01:27 -05004403 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004404 }
4405
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004406 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4407 }
4408 }
4409 catch(std::bad_alloc&)
4410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004411 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004412 }
4413}
4414
4415void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4416 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004418 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004419 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004420 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421
4422 try
4423 {
4424 if (width < 0 || height < 0)
4425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 }
4428
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004429 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430
4431 if (context)
4432 {
Jamie Madill26e91952014-03-05 15:01:27 -05004433 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4434 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004435 {
Jamie Madill26e91952014-03-05 15:01:27 -05004436 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004437 }
4438
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004439 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004440 }
4441 }
4442 catch(std::bad_alloc&)
4443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004444 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445 }
4446}
4447
4448void __stdcall glReleaseShaderCompiler(void)
4449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004450 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451
4452 try
4453 {
4454 gl::Shader::releaseCompiler();
4455 }
4456 catch(std::bad_alloc&)
4457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004458 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004459 }
4460}
4461
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004462void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004464 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 +00004465 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466
4467 try
4468 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004470
4471 if (context)
4472 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004473 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004474 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004475 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004476 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004478
4479 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004480 }
4481 }
4482 catch(std::bad_alloc&)
4483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004484 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004485 }
4486}
4487
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004488void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4489{
4490 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4491}
4492
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004493void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4494{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004495 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004496
4497 try
4498 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004499 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004500
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501 if (context)
4502 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004503 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504 }
4505 }
4506 catch(std::bad_alloc&)
4507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004508 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004509 }
4510}
4511
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004512void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004514 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004515
4516 try
4517 {
4518 if (condition != GL_ALL_COMPLETED_NV)
4519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004520 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004521 }
4522
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004523 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004524
4525 if (context)
4526 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004527 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004528
4529 if (fenceObject == NULL)
4530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004531 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004532 }
4533
4534 fenceObject->setFence(condition);
4535 }
4536 }
4537 catch(std::bad_alloc&)
4538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004539 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004540 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004541}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004542
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004545 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 +00004546
4547 try
4548 {
4549 if (width < 0 || height < 0)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004552 }
4553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004554 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004555
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556 if (context)
4557 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004558 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004559 }
4560 }
4561 catch(std::bad_alloc&)
4562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004563 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 }
4565}
4566
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004567void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004569 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004570 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004571 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004572
4573 try
4574 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004575 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004577 }
4578 catch(std::bad_alloc&)
4579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004581 }
4582}
4583
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004584void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004586 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 +00004587 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004588
4589 try
4590 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004591 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004593 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004594 }
4595
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004596 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597
4598 if (context)
4599 {
4600 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004601
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004602 if (!shaderObject)
4603 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004604 if (context->getProgram(shader))
4605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004606 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004607 }
4608 else
4609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004610 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004612 }
4613
4614 shaderObject->setSource(count, string, length);
4615 }
4616 }
4617 catch(std::bad_alloc&)
4618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004620 }
4621}
4622
4623void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4624{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004625 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626}
4627
4628void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4629{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004630 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 +00004631
4632 try
4633 {
4634 switch (face)
4635 {
4636 case GL_FRONT:
4637 case GL_BACK:
4638 case GL_FRONT_AND_BACK:
4639 break;
4640 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004641 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 }
4643
4644 switch (func)
4645 {
4646 case GL_NEVER:
4647 case GL_ALWAYS:
4648 case GL_LESS:
4649 case GL_LEQUAL:
4650 case GL_EQUAL:
4651 case GL_GEQUAL:
4652 case GL_GREATER:
4653 case GL_NOTEQUAL:
4654 break;
4655 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004656 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657 }
4658
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004659 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660
4661 if (context)
4662 {
4663 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4664 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004665 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666 }
4667
4668 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4669 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004670 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004671 }
4672 }
4673 }
4674 catch(std::bad_alloc&)
4675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 }
4678}
4679
4680void __stdcall glStencilMask(GLuint mask)
4681{
4682 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4683}
4684
4685void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4686{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004687 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688
4689 try
4690 {
4691 switch (face)
4692 {
4693 case GL_FRONT:
4694 case GL_BACK:
4695 case GL_FRONT_AND_BACK:
4696 break;
4697 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004698 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699 }
4700
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004701 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702
4703 if (context)
4704 {
4705 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4706 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004707 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004708 }
4709
4710 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4711 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004712 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004713 }
4714 }
4715 }
4716 catch(std::bad_alloc&)
4717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004718 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719 }
4720}
4721
4722void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4723{
4724 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4725}
4726
4727void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4728{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004729 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 +00004730 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731
4732 try
4733 {
4734 switch (face)
4735 {
4736 case GL_FRONT:
4737 case GL_BACK:
4738 case GL_FRONT_AND_BACK:
4739 break;
4740 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004741 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 }
4743
4744 switch (fail)
4745 {
4746 case GL_ZERO:
4747 case GL_KEEP:
4748 case GL_REPLACE:
4749 case GL_INCR:
4750 case GL_DECR:
4751 case GL_INVERT:
4752 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004753 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 break;
4755 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004756 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757 }
4758
4759 switch (zfail)
4760 {
4761 case GL_ZERO:
4762 case GL_KEEP:
4763 case GL_REPLACE:
4764 case GL_INCR:
4765 case GL_DECR:
4766 case GL_INVERT:
4767 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004768 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 break;
4770 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004771 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 }
4773
4774 switch (zpass)
4775 {
4776 case GL_ZERO:
4777 case GL_KEEP:
4778 case GL_REPLACE:
4779 case GL_INCR:
4780 case GL_DECR:
4781 case GL_INVERT:
4782 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004783 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 break;
4785 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004786 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787 }
4788
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790
4791 if (context)
4792 {
4793 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4794 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004795 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796 }
4797
4798 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4799 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004800 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004801 }
4802 }
4803 }
4804 catch(std::bad_alloc&)
4805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004806 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004807 }
4808}
4809
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004810GLboolean __stdcall glTestFenceNV(GLuint fence)
4811{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004812 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004813
4814 try
4815 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004816 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004817
4818 if (context)
4819 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004820 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004821
4822 if (fenceObject == NULL)
4823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004824 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004825 }
4826
Jamie Madillfb9a7402013-07-26 11:55:01 -04004827 if (fenceObject->isFence() != GL_TRUE)
4828 {
4829 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4830 }
4831
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004832 return fenceObject->testFence();
4833 }
4834 }
4835 catch(std::bad_alloc&)
4836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004837 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004838 }
4839
4840 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004841}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004842
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004843void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4844 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004846 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004847 "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 +00004848 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849
4850 try
4851 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853
4854 if (context)
4855 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004856 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004857 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004858 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004859 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004860 return;
4861 }
4862
4863 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004864 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004865 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004866 {
4867 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004868 }
4869
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004870 switch (target)
4871 {
4872 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004873 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004874 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004875 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004876 }
4877 break;
4878 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004879 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004880 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004881 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004882 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004883 break;
4884 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4885 {
4886 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004887 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004888 }
4889 break;
4890 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4891 {
4892 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004893 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004894 }
4895 break;
4896 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4897 {
4898 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004899 texture->setImageNegY(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_Z:
4903 {
4904 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004905 texture->setImagePosZ(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_Z:
4909 {
4910 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004911 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004912 }
4913 break;
4914 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004915 }
4916 }
4917 }
4918 catch(std::bad_alloc&)
4919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004921 }
4922}
4923
4924void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4925{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004926 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4927
4928 try
4929 {
4930 gl::Context *context = gl::getNonLostContext();
4931
4932 if (context)
4933 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004934 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004935 {
4936 return;
4937 }
4938
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004939 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004940
Jamie Madillfb8a8302013-07-03 14:24:12 -04004941 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004943 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004944 }
4945
4946 switch (pname)
4947 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004948 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4949 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4950 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4951 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4952 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4953 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4954 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4955 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4956 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004957 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4958 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4959 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4960 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004961
Jamie Madill478fdb22013-07-19 16:36:59 -04004962 case GL_TEXTURE_BASE_LEVEL:
4963 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004964 case GL_TEXTURE_MIN_LOD:
4965 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004966 UNIMPLEMENTED();
4967 break;
4968
Jamie Madill478fdb22013-07-19 16:36:59 -04004969 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004970 }
4971 }
4972 }
4973 catch(std::bad_alloc&)
4974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004975 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004976 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004977}
4978
4979void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4980{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004981 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982}
4983
4984void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4985{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004986 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004987
4988 try
4989 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004990 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991
4992 if (context)
4993 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004994 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004995 {
4996 return;
4997 }
4998
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004999 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005000
Jamie Madillfb8a8302013-07-03 14:24:12 -04005001 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005003 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005004 }
5005
5006 switch (pname)
5007 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005008 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5009 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5010 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5011 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5012 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5013 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5014 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5015 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5016 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005017 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5018 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5019 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5020 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005021
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005022 case GL_TEXTURE_BASE_LEVEL:
5023 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005024 case GL_TEXTURE_MIN_LOD:
5025 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005026 UNIMPLEMENTED();
5027 break;
5028
Jamie Madill478fdb22013-07-19 16:36:59 -04005029 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005030 }
5031 }
5032 }
5033 catch(std::bad_alloc&)
5034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036 }
5037}
5038
5039void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5040{
5041 glTexParameteri(target, pname, *params);
5042}
5043
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005044void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5045{
5046 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5047 target, levels, internalformat, width, height);
5048
5049 try
5050 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005051 gl::Context *context = gl::getNonLostContext();
5052
5053 if (context)
5054 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005055 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005056 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005057 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005058 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005059 }
5060
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005061 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005062 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005063 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005064 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005065 }
5066
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005067 switch (target)
5068 {
5069 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005070 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005071 gl::Texture2D *texture2d = context->getTexture2D();
5072 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005073 }
5074 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005075
Geoff Lang01c21d22013-09-24 11:52:16 -04005076 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005077 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005078 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5079 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005080 }
5081 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005082
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005083 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005084 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005085 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005086 }
5087 }
5088 catch(std::bad_alloc&)
5089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005090 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005091 }
5092}
5093
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005094void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5095 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005096{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005097 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005098 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005099 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 target, level, xoffset, yoffset, width, height, format, type, pixels);
5101
5102 try
5103 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005104 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005105
5106 if (context)
5107 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005108 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005109 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005110 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005111 {
5112 return;
5113 }
5114
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005115 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005116 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005117 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005118 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005119 return;
5120 }
5121
5122 switch (target)
5123 {
5124 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005125 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005126 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005127 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005128 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005129 break;
5130
5131 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5132 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5133 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5134 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5135 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5136 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005137 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005138 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005139 texture->subImage(target, 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 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005144 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005145 }
5146 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005147 }
5148 catch(std::bad_alloc&)
5149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005150 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151 }
5152}
5153
5154void __stdcall glUniform1f(GLint location, GLfloat x)
5155{
5156 glUniform1fv(location, 1, &x);
5157}
5158
5159void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005161 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162
5163 try
5164 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 if (count < 0)
5166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005167 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005168 }
5169
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005170 if (location == -1)
5171 {
5172 return;
5173 }
5174
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005175 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176
5177 if (context)
5178 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005179 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005180 if (!programBinary)
5181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005182 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005183 }
5184
5185 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005187 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188 }
5189 }
5190 }
5191 catch(std::bad_alloc&)
5192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005193 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005194 }
5195}
5196
5197void __stdcall glUniform1i(GLint location, GLint x)
5198{
5199 glUniform1iv(location, 1, &x);
5200}
5201
5202void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5203{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005204 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005205
5206 try
5207 {
5208 if (count < 0)
5209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005210 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211 }
5212
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005213 if (location == -1)
5214 {
5215 return;
5216 }
5217
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005218 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219
5220 if (context)
5221 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005222 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005223 if (!programBinary)
5224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005225 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005226 }
5227
5228 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005230 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231 }
5232 }
5233 }
5234 catch(std::bad_alloc&)
5235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005237 }
5238}
5239
5240void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5241{
5242 GLfloat xy[2] = {x, y};
5243
5244 glUniform2fv(location, 1, (GLfloat*)&xy);
5245}
5246
5247void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005249 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250
5251 try
5252 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 if (count < 0)
5254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005255 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005257
5258 if (location == -1)
5259 {
5260 return;
5261 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005263 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005264
5265 if (context)
5266 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005267 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005268 if (!programBinary)
5269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005270 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005271 }
5272
5273 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005275 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276 }
5277 }
5278 }
5279 catch(std::bad_alloc&)
5280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282 }
5283}
5284
5285void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5286{
5287 GLint xy[4] = {x, y};
5288
5289 glUniform2iv(location, 1, (GLint*)&xy);
5290}
5291
5292void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005294 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005295
5296 try
5297 {
5298 if (count < 0)
5299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005300 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 }
5302
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005303 if (location == -1)
5304 {
5305 return;
5306 }
5307
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005308 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005309
5310 if (context)
5311 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005312 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005313 if (!programBinary)
5314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005315 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005316 }
5317
5318 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005320 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005321 }
5322 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323 }
5324 catch(std::bad_alloc&)
5325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005326 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005327 }
5328}
5329
5330void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5331{
5332 GLfloat xyz[3] = {x, y, z};
5333
5334 glUniform3fv(location, 1, (GLfloat*)&xyz);
5335}
5336
5337void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005339 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340
5341 try
5342 {
5343 if (count < 0)
5344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005345 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346 }
5347
5348 if (location == -1)
5349 {
5350 return;
5351 }
5352
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005353 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354
5355 if (context)
5356 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005357 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005358 if (!programBinary)
5359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005360 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005361 }
5362
5363 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005365 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366 }
5367 }
5368 }
5369 catch(std::bad_alloc&)
5370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005371 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372 }
5373}
5374
5375void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5376{
5377 GLint xyz[3] = {x, y, z};
5378
5379 glUniform3iv(location, 1, (GLint*)&xyz);
5380}
5381
5382void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5383{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005384 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005385
5386 try
5387 {
5388 if (count < 0)
5389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391 }
5392
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005393 if (location == -1)
5394 {
5395 return;
5396 }
5397
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005398 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005399
5400 if (context)
5401 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005402 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005403 if (!programBinary)
5404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005405 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005406 }
5407
5408 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005411 }
5412 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413 }
5414 catch(std::bad_alloc&)
5415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417 }
5418}
5419
5420void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5421{
5422 GLfloat xyzw[4] = {x, y, z, w};
5423
5424 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5425}
5426
5427void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005429 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430
5431 try
5432 {
5433 if (count < 0)
5434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436 }
5437
5438 if (location == -1)
5439 {
5440 return;
5441 }
5442
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005443 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444
5445 if (context)
5446 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005447 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005448 if (!programBinary)
5449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005451 }
5452
5453 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456 }
5457 }
5458 }
5459 catch(std::bad_alloc&)
5460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005461 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 }
5463}
5464
5465void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5466{
5467 GLint xyzw[4] = {x, y, z, w};
5468
5469 glUniform4iv(location, 1, (GLint*)&xyzw);
5470}
5471
5472void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005474 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475
5476 try
5477 {
5478 if (count < 0)
5479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005480 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 }
5482
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005483 if (location == -1)
5484 {
5485 return;
5486 }
5487
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005489
5490 if (context)
5491 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005492 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005493 if (!programBinary)
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005496 }
5497
5498 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005501 }
5502 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503 }
5504 catch(std::bad_alloc&)
5505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005506 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005507 }
5508}
5509
5510void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5511{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005512 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005513 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514
5515 try
5516 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005517 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005519 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 }
5521
5522 if (location == -1)
5523 {
5524 return;
5525 }
5526
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005527 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005528
5529 if (context)
5530 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005531 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5532 {
5533 return gl::error(GL_INVALID_VALUE);
5534 }
5535
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005536 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005537 if (!programBinary)
5538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005539 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005540 }
5541
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005542 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005544 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005545 }
5546 }
5547 }
5548 catch(std::bad_alloc&)
5549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005550 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005551 }
5552}
5553
5554void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5555{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005556 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005557 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005558
5559 try
5560 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005561 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005564 }
5565
5566 if (location == -1)
5567 {
5568 return;
5569 }
5570
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005571 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572
5573 if (context)
5574 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005575 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5576 {
5577 return gl::error(GL_INVALID_VALUE);
5578 }
5579
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005580 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005581 if (!programBinary)
5582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005583 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005584 }
5585
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005586 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005588 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 }
5590 }
5591 }
5592 catch(std::bad_alloc&)
5593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005595 }
5596}
5597
5598void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5599{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005600 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005601 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602
5603 try
5604 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005605 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005608 }
5609
5610 if (location == -1)
5611 {
5612 return;
5613 }
5614
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005615 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616
5617 if (context)
5618 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005619 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5620 {
5621 return gl::error(GL_INVALID_VALUE);
5622 }
5623
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005624 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005625 if (!programBinary)
5626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005627 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005628 }
5629
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005630 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005632 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005633 }
5634 }
5635 }
5636 catch(std::bad_alloc&)
5637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005638 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005639 }
5640}
5641
5642void __stdcall glUseProgram(GLuint program)
5643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005644 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645
5646 try
5647 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005648 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649
5650 if (context)
5651 {
5652 gl::Program *programObject = context->getProgram(program);
5653
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005654 if (!programObject && program != 0)
5655 {
5656 if (context->getShader(program))
5657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005658 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005659 }
5660 else
5661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005662 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005663 }
5664 }
5665
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005666 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005668 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005669 }
5670
5671 context->useProgram(program);
5672 }
5673 }
5674 catch(std::bad_alloc&)
5675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005676 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005677 }
5678}
5679
5680void __stdcall glValidateProgram(GLuint program)
5681{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005682 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005683
5684 try
5685 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005687
5688 if (context)
5689 {
5690 gl::Program *programObject = context->getProgram(program);
5691
5692 if (!programObject)
5693 {
5694 if (context->getShader(program))
5695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005696 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005697 }
5698 else
5699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005701 }
5702 }
5703
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005704 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005705 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707 catch(std::bad_alloc&)
5708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005709 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005710 }
5711}
5712
5713void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005715 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716
5717 try
5718 {
5719 if (index >= gl::MAX_VERTEX_ATTRIBS)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005724 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005725
5726 if (context)
5727 {
5728 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005729 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005730 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005731 }
5732 catch(std::bad_alloc&)
5733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005734 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005735 }
5736}
5737
5738void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005740 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005741
5742 try
5743 {
5744 if (index >= gl::MAX_VERTEX_ATTRIBS)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005750
5751 if (context)
5752 {
5753 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005754 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005755 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 }
5757 catch(std::bad_alloc&)
5758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005759 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005760 }
5761}
5762
5763void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5764{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005765 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005766
5767 try
5768 {
5769 if (index >= gl::MAX_VERTEX_ATTRIBS)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005775
5776 if (context)
5777 {
5778 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005779 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005780 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781 }
5782 catch(std::bad_alloc&)
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005785 }
5786}
5787
5788void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5789{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005790 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005791
5792 try
5793 {
5794 if (index >= gl::MAX_VERTEX_ATTRIBS)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005800
5801 if (context)
5802 {
5803 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005804 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005805 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806 }
5807 catch(std::bad_alloc&)
5808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005809 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005810 }
5811}
5812
5813void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005815 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 +00005816
5817 try
5818 {
5819 if (index >= gl::MAX_VERTEX_ATTRIBS)
5820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005825
5826 if (context)
5827 {
5828 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005829 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005830 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831 }
5832 catch(std::bad_alloc&)
5833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005834 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835 }
5836}
5837
5838void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5839{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005840 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841
5842 try
5843 {
5844 if (index >= gl::MAX_VERTEX_ATTRIBS)
5845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005849 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005850
5851 if (context)
5852 {
5853 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005854 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005855 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 }
5857 catch(std::bad_alloc&)
5858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 }
5861}
5862
5863void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005865 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 +00005866
5867 try
5868 {
5869 if (index >= gl::MAX_VERTEX_ATTRIBS)
5870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005871 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005874 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005875
5876 if (context)
5877 {
5878 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005879 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882 catch(std::bad_alloc&)
5883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005885 }
5886}
5887
5888void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005890 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005891
5892 try
5893 {
5894 if (index >= gl::MAX_VERTEX_ATTRIBS)
5895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005900
5901 if (context)
5902 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005903 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005904 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905 }
5906 catch(std::bad_alloc&)
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
5910}
5911
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005912void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5913{
5914 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5915
5916 try
5917 {
5918 if (index >= gl::MAX_VERTEX_ATTRIBS)
5919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005921 }
5922
5923 gl::Context *context = gl::getNonLostContext();
5924
5925 if (context)
5926 {
5927 context->setVertexAttribDivisor(index, divisor);
5928 }
5929 }
5930 catch(std::bad_alloc&)
5931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005933 }
5934}
5935
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005936void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005938 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005939 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005940 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941
5942 try
5943 {
5944 if (index >= gl::MAX_VERTEX_ATTRIBS)
5945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005946 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 }
5948
5949 if (size < 1 || size > 4)
5950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005952 }
5953
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005954 gl::Context *context = gl::getNonLostContext();
5955
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956 switch (type)
5957 {
5958 case GL_BYTE:
5959 case GL_UNSIGNED_BYTE:
5960 case GL_SHORT:
5961 case GL_UNSIGNED_SHORT:
5962 case GL_FIXED:
5963 case GL_FLOAT:
5964 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005965 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005966 case GL_INT:
5967 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005968 case GL_INT_2_10_10_10_REV:
5969 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005970 if (context && context->getClientVersion() < 3)
5971 {
5972 return gl::error(GL_INVALID_ENUM);
5973 }
5974 else
5975 {
5976 break;
5977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005978 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005980 }
5981
5982 if (stride < 0)
5983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005984 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005985 }
5986
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005987 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5988 {
5989 return gl::error(GL_INVALID_OPERATION);
5990 }
5991
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992 if (context)
5993 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005994 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5995 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5996 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5997 // and the pointer argument is not NULL.
5998 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5999 {
6000 return gl::error(GL_INVALID_OPERATION);
6001 }
6002
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006003 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6004 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006005 }
6006 }
6007 catch(std::bad_alloc&)
6008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011}
6012
6013void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006015 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 +00006016
6017 try
6018 {
6019 if (width < 0 || height < 0)
6020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006024 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006025
6026 if (context)
6027 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006028 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006029 }
6030 }
6031 catch(std::bad_alloc&)
6032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006033 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006034 }
6035}
6036
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006037// OpenGL ES 3.0 functions
6038
6039void __stdcall glReadBuffer(GLenum mode)
6040{
6041 EVENT("(GLenum mode = 0x%X)", mode);
6042
6043 try
6044 {
6045 gl::Context *context = gl::getNonLostContext();
6046
6047 if (context)
6048 {
6049 if (context->getClientVersion() < 3)
6050 {
6051 return gl::error(GL_INVALID_OPERATION);
6052 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006053
Jamie Madill54133512013-06-21 09:33:07 -04006054 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006055 UNIMPLEMENTED();
6056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006057 }
6058 catch(std::bad_alloc&)
6059 {
6060 return gl::error(GL_OUT_OF_MEMORY);
6061 }
6062}
6063
6064void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6065{
6066 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6067 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6068
6069 try
6070 {
6071 gl::Context *context = gl::getNonLostContext();
6072
6073 if (context)
6074 {
6075 if (context->getClientVersion() < 3)
6076 {
6077 return gl::error(GL_INVALID_OPERATION);
6078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006079
Jamie Madill54133512013-06-21 09:33:07 -04006080 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006081 UNIMPLEMENTED();
6082 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006083 }
6084 catch(std::bad_alloc&)
6085 {
6086 return gl::error(GL_OUT_OF_MEMORY);
6087 }
6088}
6089
6090void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6091{
6092 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6093 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6094 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6095 target, level, internalformat, width, height, depth, border, format, type, pixels);
6096
6097 try
6098 {
6099 gl::Context *context = gl::getNonLostContext();
6100
6101 if (context)
6102 {
6103 if (context->getClientVersion() < 3)
6104 {
6105 return gl::error(GL_INVALID_OPERATION);
6106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006107
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006108 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006109 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006110 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006111 {
6112 return;
6113 }
6114
6115 switch(target)
6116 {
6117 case GL_TEXTURE_3D:
6118 {
6119 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006120 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006121 }
6122 break;
6123
6124 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006125 {
6126 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006127 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006128 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006129 break;
6130
6131 default:
6132 return gl::error(GL_INVALID_ENUM);
6133 }
6134 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006135 }
6136 catch(std::bad_alloc&)
6137 {
6138 return gl::error(GL_OUT_OF_MEMORY);
6139 }
6140}
6141
6142void __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)
6143{
6144 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6145 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6146 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6147 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6148
6149 try
6150 {
6151 gl::Context *context = gl::getNonLostContext();
6152
6153 if (context)
6154 {
6155 if (context->getClientVersion() < 3)
6156 {
6157 return gl::error(GL_INVALID_OPERATION);
6158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006159
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006160 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006161 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006162 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006163 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006164 {
6165 return;
6166 }
6167
6168 switch(target)
6169 {
6170 case GL_TEXTURE_3D:
6171 {
6172 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006173 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 +00006174 }
6175 break;
6176
6177 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006178 {
6179 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006180 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 +00006181 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006182 break;
6183
6184 default:
6185 return gl::error(GL_INVALID_ENUM);
6186 }
6187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006188 }
6189 catch(std::bad_alloc&)
6190 {
6191 return gl::error(GL_OUT_OF_MEMORY);
6192 }
6193}
6194
6195void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6196{
6197 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6198 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6199 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6200
6201 try
6202 {
6203 gl::Context *context = gl::getNonLostContext();
6204
6205 if (context)
6206 {
6207 if (context->getClientVersion() < 3)
6208 {
6209 return gl::error(GL_INVALID_OPERATION);
6210 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006211
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006212 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006213 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006214 {
6215 return;
6216 }
6217
6218 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6219 gl::Texture *texture = NULL;
6220 switch (target)
6221 {
6222 case GL_TEXTURE_3D:
6223 texture = context->getTexture3D();
6224 break;
6225
6226 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006227 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006228 break;
6229
6230 default:
6231 return gl::error(GL_INVALID_ENUM);
6232 }
6233
6234 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006236 }
6237 catch(std::bad_alloc&)
6238 {
6239 return gl::error(GL_OUT_OF_MEMORY);
6240 }
6241}
6242
6243void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6244{
Geoff Langeef52cc2013-10-16 15:07:39 -04006245 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 +00006246 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6247 "const GLvoid* data = 0x%0.8p)",
6248 target, level, internalformat, width, height, depth, border, imageSize, data);
6249
6250 try
6251 {
6252 gl::Context *context = gl::getNonLostContext();
6253
6254 if (context)
6255 {
6256 if (context->getClientVersion() < 3)
6257 {
6258 return gl::error(GL_INVALID_OPERATION);
6259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006260
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006261 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 +00006262 {
6263 return gl::error(GL_INVALID_VALUE);
6264 }
6265
6266 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006267 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006268 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006269 {
6270 return;
6271 }
6272
6273 switch(target)
6274 {
6275 case GL_TEXTURE_3D:
6276 {
6277 gl::Texture3D *texture = context->getTexture3D();
6278 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6279 }
6280 break;
6281
6282 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006283 {
6284 gl::Texture2DArray *texture = context->getTexture2DArray();
6285 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6286 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006287 break;
6288
6289 default:
6290 return gl::error(GL_INVALID_ENUM);
6291 }
6292 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006293 }
6294 catch(std::bad_alloc&)
6295 {
6296 return gl::error(GL_OUT_OF_MEMORY);
6297 }
6298}
6299
6300void __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)
6301{
6302 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6303 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6304 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6305 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6306
6307 try
6308 {
6309 gl::Context *context = gl::getNonLostContext();
6310
6311 if (context)
6312 {
6313 if (context->getClientVersion() < 3)
6314 {
6315 return gl::error(GL_INVALID_OPERATION);
6316 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006317
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006318 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 +00006319 {
6320 return gl::error(GL_INVALID_VALUE);
6321 }
6322
6323 if (!data)
6324 {
6325 return gl::error(GL_INVALID_VALUE);
6326 }
6327
6328 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006329 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006330 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006331 {
6332 return;
6333 }
6334
6335 switch(target)
6336 {
6337 case GL_TEXTURE_3D:
6338 {
6339 gl::Texture3D *texture = context->getTexture3D();
6340 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6341 format, imageSize, data);
6342 }
6343 break;
6344
6345 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006346 {
6347 gl::Texture2DArray *texture = context->getTexture2DArray();
6348 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6349 format, imageSize, data);
6350 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006351 break;
6352
6353 default:
6354 return gl::error(GL_INVALID_ENUM);
6355 }
6356 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006357 }
6358 catch(std::bad_alloc&)
6359 {
6360 return gl::error(GL_OUT_OF_MEMORY);
6361 }
6362}
6363
6364void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6365{
6366 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6367
6368 try
6369 {
6370 gl::Context *context = gl::getNonLostContext();
6371
6372 if (context)
6373 {
6374 if (context->getClientVersion() < 3)
6375 {
6376 return gl::error(GL_INVALID_OPERATION);
6377 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006378
Geoff Lang37dde692014-01-31 16:34:54 -05006379 if (n < 0)
6380 {
6381 return gl::error(GL_INVALID_VALUE);
6382 }
6383
6384 for (GLsizei i = 0; i < n; i++)
6385 {
6386 ids[i] = context->createQuery();
6387 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006389 }
6390 catch(std::bad_alloc&)
6391 {
6392 return gl::error(GL_OUT_OF_MEMORY);
6393 }
6394}
6395
6396void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6397{
6398 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6399
6400 try
6401 {
6402 gl::Context *context = gl::getNonLostContext();
6403
6404 if (context)
6405 {
6406 if (context->getClientVersion() < 3)
6407 {
6408 return gl::error(GL_INVALID_OPERATION);
6409 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006410
Geoff Lang37dde692014-01-31 16:34:54 -05006411 if (n < 0)
6412 {
6413 return gl::error(GL_INVALID_VALUE);
6414 }
6415
6416 for (GLsizei i = 0; i < n; i++)
6417 {
6418 context->deleteQuery(ids[i]);
6419 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006421 }
6422 catch(std::bad_alloc&)
6423 {
6424 return gl::error(GL_OUT_OF_MEMORY);
6425 }
6426}
6427
6428GLboolean __stdcall glIsQuery(GLuint id)
6429{
6430 EVENT("(GLuint id = %u)", id);
6431
6432 try
6433 {
6434 gl::Context *context = gl::getNonLostContext();
6435
6436 if (context)
6437 {
6438 if (context->getClientVersion() < 3)
6439 {
6440 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006442
Geoff Lang37dde692014-01-31 16:34:54 -05006443 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006444 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006445 }
6446 catch(std::bad_alloc&)
6447 {
6448 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6449 }
6450
6451 return GL_FALSE;
6452}
6453
6454void __stdcall glBeginQuery(GLenum target, GLuint id)
6455{
6456 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6457
6458 try
6459 {
6460 gl::Context *context = gl::getNonLostContext();
6461
6462 if (context)
6463 {
6464 if (context->getClientVersion() < 3)
6465 {
6466 return gl::error(GL_INVALID_OPERATION);
6467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006468
Geoff Lang37dde692014-01-31 16:34:54 -05006469 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006470 {
Geoff Lang37dde692014-01-31 16:34:54 -05006471 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006472 }
6473
6474 if (id == 0)
6475 {
6476 return gl::error(GL_INVALID_OPERATION);
6477 }
6478
Geoff Lang37dde692014-01-31 16:34:54 -05006479 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006480 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006481 }
6482 catch(std::bad_alloc&)
6483 {
6484 return gl::error(GL_OUT_OF_MEMORY);
6485 }
6486}
6487
6488void __stdcall glEndQuery(GLenum target)
6489{
6490 EVENT("(GLenum target = 0x%X)", target);
6491
6492 try
6493 {
6494 gl::Context *context = gl::getNonLostContext();
6495
6496 if (context)
6497 {
6498 if (context->getClientVersion() < 3)
6499 {
6500 return gl::error(GL_INVALID_OPERATION);
6501 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006502
Geoff Lang37dde692014-01-31 16:34:54 -05006503 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006504 {
Geoff Lang37dde692014-01-31 16:34:54 -05006505 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006506 }
Geoff Lang37dde692014-01-31 16:34:54 -05006507
6508 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006510 }
6511 catch(std::bad_alloc&)
6512 {
6513 return gl::error(GL_OUT_OF_MEMORY);
6514 }
6515}
6516
6517void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6518{
6519 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6520
6521 try
6522 {
6523 gl::Context *context = gl::getNonLostContext();
6524
6525 if (context)
6526 {
6527 if (context->getClientVersion() < 3)
6528 {
6529 return gl::error(GL_INVALID_OPERATION);
6530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006531
Geoff Lang37dde692014-01-31 16:34:54 -05006532 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006533 {
Geoff Lang37dde692014-01-31 16:34:54 -05006534 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006535 }
Geoff Lang37dde692014-01-31 16:34:54 -05006536
6537 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006538 {
Geoff Lang37dde692014-01-31 16:34:54 -05006539 case GL_CURRENT_QUERY:
6540 params[0] = context->getActiveQuery(target);
6541 break;
6542
6543 default:
6544 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006545 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006547 }
6548 catch(std::bad_alloc&)
6549 {
6550 return gl::error(GL_OUT_OF_MEMORY);
6551 }
6552}
6553
6554void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6555{
6556 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6557
6558 try
6559 {
6560 gl::Context *context = gl::getNonLostContext();
6561
6562 if (context)
6563 {
6564 if (context->getClientVersion() < 3)
6565 {
6566 return gl::error(GL_INVALID_OPERATION);
6567 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006568
Geoff Lang37dde692014-01-31 16:34:54 -05006569 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6570
6571 if (!queryObject)
6572 {
6573 return gl::error(GL_INVALID_OPERATION);
6574 }
6575
6576 if (context->getActiveQuery(queryObject->getType()) == id)
6577 {
6578 return gl::error(GL_INVALID_OPERATION);
6579 }
6580
6581 switch(pname)
6582 {
6583 case GL_QUERY_RESULT:
6584 params[0] = queryObject->getResult();
6585 break;
6586 case GL_QUERY_RESULT_AVAILABLE:
6587 params[0] = queryObject->isResultAvailable();
6588 break;
6589 default:
6590 return gl::error(GL_INVALID_ENUM);
6591 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006593 }
6594 catch(std::bad_alloc&)
6595 {
6596 return gl::error(GL_OUT_OF_MEMORY);
6597 }
6598}
6599
6600GLboolean __stdcall glUnmapBuffer(GLenum target)
6601{
6602 EVENT("(GLenum target = 0x%X)", target);
6603
6604 try
6605 {
6606 gl::Context *context = gl::getNonLostContext();
6607
6608 if (context)
6609 {
6610 if (context->getClientVersion() < 3)
6611 {
6612 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006614
Jamie Madill7a5f7382014-03-05 15:01:24 -05006615 if (!gl::ValidBufferTarget(context, target))
6616 {
6617 return gl::error(GL_INVALID_ENUM, GL_FALSE);
6618 }
6619
6620 gl::Buffer *buffer = context->getTargetBuffer(target);
6621
6622 if (buffer == NULL || !buffer->mapped())
6623 {
6624 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6625 }
6626
6627 // TODO: detect if we had corruption. if so, throw an error and return false.
6628
6629 buffer->unmap();
6630
6631 return GL_TRUE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006633 }
6634 catch(std::bad_alloc&)
6635 {
6636 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6637 }
6638
6639 return GL_FALSE;
6640}
6641
6642void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6643{
6644 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6645
6646 try
6647 {
6648 gl::Context *context = gl::getNonLostContext();
6649
6650 if (context)
6651 {
6652 if (context->getClientVersion() < 3)
6653 {
6654 return gl::error(GL_INVALID_OPERATION);
6655 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006656
Jamie Madill70656a62014-03-05 15:01:26 -05006657 if (!gl::ValidBufferTarget(context, target))
6658 {
6659 return gl::error(GL_INVALID_ENUM);
6660 }
6661
6662 if (pname != GL_BUFFER_MAP_POINTER)
6663 {
6664 return gl::error(GL_INVALID_ENUM);
6665 }
6666
6667 gl::Buffer *buffer = context->getTargetBuffer(target);
6668
6669 if (!buffer || !buffer->mapped())
6670 {
6671 *params = NULL;
6672 }
6673
6674 *params = buffer->mapPointer();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006675 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006676 }
6677 catch(std::bad_alloc&)
6678 {
6679 return gl::error(GL_OUT_OF_MEMORY);
6680 }
6681}
6682
6683void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6684{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006685 try
6686 {
6687 gl::Context *context = gl::getNonLostContext();
6688
6689 if (context)
6690 {
6691 if (context->getClientVersion() < 3)
6692 {
6693 return gl::error(GL_INVALID_OPERATION);
6694 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006695
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006696 glDrawBuffersEXT(n, bufs);
6697 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006698 }
6699 catch(std::bad_alloc&)
6700 {
6701 return gl::error(GL_OUT_OF_MEMORY);
6702 }
6703}
6704
6705void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6706{
6707 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6708 location, count, transpose, value);
6709
6710 try
6711 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006712 if (count < 0)
6713 {
6714 return gl::error(GL_INVALID_VALUE);
6715 }
6716
6717 if (location == -1)
6718 {
6719 return;
6720 }
6721
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006722 gl::Context *context = gl::getNonLostContext();
6723
6724 if (context)
6725 {
6726 if (context->getClientVersion() < 3)
6727 {
6728 return gl::error(GL_INVALID_OPERATION);
6729 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006730
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006731 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6732 if (!programBinary)
6733 {
6734 return gl::error(GL_INVALID_OPERATION);
6735 }
6736
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006737 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006738 {
6739 return gl::error(GL_INVALID_OPERATION);
6740 }
6741 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006742 }
6743 catch(std::bad_alloc&)
6744 {
6745 return gl::error(GL_OUT_OF_MEMORY);
6746 }
6747}
6748
6749void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6750{
6751 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6752 location, count, transpose, value);
6753
6754 try
6755 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006756 if (count < 0)
6757 {
6758 return gl::error(GL_INVALID_VALUE);
6759 }
6760
6761 if (location == -1)
6762 {
6763 return;
6764 }
6765
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006766 gl::Context *context = gl::getNonLostContext();
6767
6768 if (context)
6769 {
6770 if (context->getClientVersion() < 3)
6771 {
6772 return gl::error(GL_INVALID_OPERATION);
6773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006774
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006775 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6776 if (!programBinary)
6777 {
6778 return gl::error(GL_INVALID_OPERATION);
6779 }
6780
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006781 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006782 {
6783 return gl::error(GL_INVALID_OPERATION);
6784 }
6785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006786 }
6787 catch(std::bad_alloc&)
6788 {
6789 return gl::error(GL_OUT_OF_MEMORY);
6790 }
6791}
6792
6793void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6794{
6795 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6796 location, count, transpose, value);
6797
6798 try
6799 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006800 if (count < 0)
6801 {
6802 return gl::error(GL_INVALID_VALUE);
6803 }
6804
6805 if (location == -1)
6806 {
6807 return;
6808 }
6809
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006810 gl::Context *context = gl::getNonLostContext();
6811
6812 if (context)
6813 {
6814 if (context->getClientVersion() < 3)
6815 {
6816 return gl::error(GL_INVALID_OPERATION);
6817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006818
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006819 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6820 if (!programBinary)
6821 {
6822 return gl::error(GL_INVALID_OPERATION);
6823 }
6824
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006825 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006826 {
6827 return gl::error(GL_INVALID_OPERATION);
6828 }
6829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006830 }
6831 catch(std::bad_alloc&)
6832 {
6833 return gl::error(GL_OUT_OF_MEMORY);
6834 }
6835}
6836
6837void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6838{
6839 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6840 location, count, transpose, value);
6841
6842 try
6843 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006844 if (count < 0)
6845 {
6846 return gl::error(GL_INVALID_VALUE);
6847 }
6848
6849 if (location == -1)
6850 {
6851 return;
6852 }
6853
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006854 gl::Context *context = gl::getNonLostContext();
6855
6856 if (context)
6857 {
6858 if (context->getClientVersion() < 3)
6859 {
6860 return gl::error(GL_INVALID_OPERATION);
6861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006862
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006863 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6864 if (!programBinary)
6865 {
6866 return gl::error(GL_INVALID_OPERATION);
6867 }
6868
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006869 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006870 {
6871 return gl::error(GL_INVALID_OPERATION);
6872 }
6873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006874 }
6875 catch(std::bad_alloc&)
6876 {
6877 return gl::error(GL_OUT_OF_MEMORY);
6878 }
6879}
6880
6881void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6882{
6883 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6884 location, count, transpose, value);
6885
6886 try
6887 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006888 if (count < 0)
6889 {
6890 return gl::error(GL_INVALID_VALUE);
6891 }
6892
6893 if (location == -1)
6894 {
6895 return;
6896 }
6897
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006898 gl::Context *context = gl::getNonLostContext();
6899
6900 if (context)
6901 {
6902 if (context->getClientVersion() < 3)
6903 {
6904 return gl::error(GL_INVALID_OPERATION);
6905 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006906
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006907 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6908 if (!programBinary)
6909 {
6910 return gl::error(GL_INVALID_OPERATION);
6911 }
6912
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006913 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006914 {
6915 return gl::error(GL_INVALID_OPERATION);
6916 }
6917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006918 }
6919 catch(std::bad_alloc&)
6920 {
6921 return gl::error(GL_OUT_OF_MEMORY);
6922 }
6923}
6924
6925void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6926{
6927 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6928 location, count, transpose, value);
6929
6930 try
6931 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006932 if (count < 0)
6933 {
6934 return gl::error(GL_INVALID_VALUE);
6935 }
6936
6937 if (location == -1)
6938 {
6939 return;
6940 }
6941
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006942 gl::Context *context = gl::getNonLostContext();
6943
6944 if (context)
6945 {
6946 if (context->getClientVersion() < 3)
6947 {
6948 return gl::error(GL_INVALID_OPERATION);
6949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006950
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006951 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6952 if (!programBinary)
6953 {
6954 return gl::error(GL_INVALID_OPERATION);
6955 }
6956
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006957 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006958 {
6959 return gl::error(GL_INVALID_OPERATION);
6960 }
6961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006962 }
6963 catch(std::bad_alloc&)
6964 {
6965 return gl::error(GL_OUT_OF_MEMORY);
6966 }
6967}
6968
6969void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6970{
6971 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6972 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6973 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6974
6975 try
6976 {
6977 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006978 if (context)
6979 {
6980 if (context->getClientVersion() < 3)
6981 {
6982 return gl::error(GL_INVALID_OPERATION);
6983 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006984
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006985 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006986 dstX0, dstY0, dstX1, dstY1, mask, filter,
6987 false))
6988 {
6989 return;
6990 }
6991
6992 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6993 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006994 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006995 }
6996 catch(std::bad_alloc&)
6997 {
6998 return gl::error(GL_OUT_OF_MEMORY);
6999 }
7000}
7001
7002void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7003{
7004 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7005 target, samples, internalformat, width, height);
7006
7007 try
7008 {
7009 gl::Context *context = gl::getNonLostContext();
7010
7011 if (context)
7012 {
7013 if (context->getClientVersion() < 3)
7014 {
7015 return gl::error(GL_INVALID_OPERATION);
7016 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007017
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007018 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007019 width, height, false))
7020 {
7021 return;
7022 }
7023
7024 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007025 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007026 }
7027 catch(std::bad_alloc&)
7028 {
7029 return gl::error(GL_OUT_OF_MEMORY);
7030 }
7031}
7032
7033void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7034{
7035 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7036 target, attachment, texture, level, layer);
7037
7038 try
7039 {
7040 gl::Context *context = gl::getNonLostContext();
7041
7042 if (context)
7043 {
7044 if (context->getClientVersion() < 3)
7045 {
7046 return gl::error(GL_INVALID_OPERATION);
7047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007048
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007049 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007050 {
7051 return;
7052 }
7053
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007054 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7055 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007056
7057 gl::Texture *textureObject = context->getTexture(texture);
7058 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7059
7060 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7061 {
7062 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7063 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7064 }
7065 else
7066 {
7067 switch (attachment)
7068 {
7069 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7070 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7071 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7072 }
7073 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007074 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007075 }
7076 catch(std::bad_alloc&)
7077 {
7078 return gl::error(GL_OUT_OF_MEMORY);
7079 }
7080}
7081
7082GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7083{
7084 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7085 target, offset, length, access);
7086
7087 try
7088 {
7089 gl::Context *context = gl::getNonLostContext();
7090
7091 if (context)
7092 {
7093 if (context->getClientVersion() < 3)
7094 {
7095 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007097
Jamie Madill7a5f7382014-03-05 15:01:24 -05007098 if (!gl::ValidBufferTarget(context, target))
7099 {
7100 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
7101 }
7102
7103 if (offset < 0 || length < 0)
7104 {
7105 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7106 }
7107
7108 gl::Buffer *buffer = context->getTargetBuffer(target);
7109
7110 if (buffer == NULL)
7111 {
7112 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7113 }
7114
7115 // Check for buffer overflow
7116 size_t offsetSize = static_cast<size_t>(offset);
7117 size_t lengthSize = static_cast<size_t>(length);
7118
7119 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7120 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
7121 {
7122 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7123 }
7124
7125 // Check for invalid bits in the mask
7126 GLbitfield allAccessBits = GL_MAP_READ_BIT |
7127 GL_MAP_WRITE_BIT |
7128 GL_MAP_INVALIDATE_RANGE_BIT |
7129 GL_MAP_INVALIDATE_BUFFER_BIT |
7130 GL_MAP_FLUSH_EXPLICIT_BIT |
7131 GL_MAP_UNSYNCHRONIZED_BIT;
7132
7133 if (access & ~(allAccessBits))
7134 {
7135 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7136 }
7137
7138 if (length == 0 || buffer->mapped())
7139 {
7140 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7141 }
7142
7143 // Check for invalid bit combinations
7144 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
7145 {
7146 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7147 }
7148
7149 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
7150 GL_MAP_INVALIDATE_BUFFER_BIT |
7151 GL_MAP_UNSYNCHRONIZED_BIT;
7152
7153 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
7154 {
7155 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7156 }
7157
7158 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
7159 {
7160 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7161 }
7162
7163 return buffer->mapRange(offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007165 }
7166 catch(std::bad_alloc&)
7167 {
7168 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7169 }
7170
7171 return NULL;
7172}
7173
7174void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7175{
7176 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7177
7178 try
7179 {
7180 gl::Context *context = gl::getNonLostContext();
7181
7182 if (context)
7183 {
7184 if (context->getClientVersion() < 3)
7185 {
7186 return gl::error(GL_INVALID_OPERATION);
7187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188
Jamie Madill7a5f7382014-03-05 15:01:24 -05007189 if (offset < 0 || length < 0)
7190 {
7191 return gl::error(GL_INVALID_VALUE);
7192 }
7193
7194 if (!gl::ValidBufferTarget(context, target))
7195 {
7196 return gl::error(GL_INVALID_ENUM);
7197 }
7198
7199 gl::Buffer *buffer = context->getTargetBuffer(target);
7200
7201 if (buffer == NULL)
7202 {
7203 return gl::error(GL_INVALID_OPERATION);
7204 }
7205
7206 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
7207 {
7208 return gl::error(GL_INVALID_OPERATION);
7209 }
7210
7211 // Check for buffer overflow
7212 size_t offsetSize = static_cast<size_t>(offset);
7213 size_t lengthSize = static_cast<size_t>(length);
7214
7215 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7216 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
7217 {
7218 return gl::error(GL_INVALID_VALUE);
7219 }
7220
7221 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007223 }
7224 catch(std::bad_alloc&)
7225 {
7226 return gl::error(GL_OUT_OF_MEMORY);
7227 }
7228}
7229
7230void __stdcall glBindVertexArray(GLuint array)
7231{
7232 EVENT("(GLuint array = %u)", array);
7233
7234 try
7235 {
7236 gl::Context *context = gl::getNonLostContext();
7237
7238 if (context)
7239 {
7240 if (context->getClientVersion() < 3)
7241 {
7242 return gl::error(GL_INVALID_OPERATION);
7243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007244
Jamie Madilld1028542013-07-02 11:57:04 -04007245 gl::VertexArray *vao = context->getVertexArray(array);
7246
7247 if (!vao)
7248 {
7249 // The default VAO should always exist
7250 ASSERT(array != 0);
7251 return gl::error(GL_INVALID_OPERATION);
7252 }
7253
7254 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007256 }
7257 catch(std::bad_alloc&)
7258 {
7259 return gl::error(GL_OUT_OF_MEMORY);
7260 }
7261}
7262
7263void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7264{
7265 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7266
7267 try
7268 {
7269 gl::Context *context = gl::getNonLostContext();
7270
7271 if (context)
7272 {
7273 if (context->getClientVersion() < 3)
7274 {
7275 return gl::error(GL_INVALID_OPERATION);
7276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007277
Jamie Madilld1028542013-07-02 11:57:04 -04007278 if (n < 0)
7279 {
7280 return gl::error(GL_INVALID_VALUE);
7281 }
7282
7283 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7284 {
7285 if (arrays[arrayIndex] != 0)
7286 {
7287 context->deleteVertexArray(arrays[arrayIndex]);
7288 }
7289 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007291 }
7292 catch(std::bad_alloc&)
7293 {
7294 return gl::error(GL_OUT_OF_MEMORY);
7295 }
7296}
7297
7298void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7299{
7300 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7301
7302 try
7303 {
7304 gl::Context *context = gl::getNonLostContext();
7305
7306 if (context)
7307 {
7308 if (context->getClientVersion() < 3)
7309 {
7310 return gl::error(GL_INVALID_OPERATION);
7311 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007312
Jamie Madilld1028542013-07-02 11:57:04 -04007313 if (n < 0)
7314 {
7315 return gl::error(GL_INVALID_VALUE);
7316 }
7317
7318 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7319 {
7320 arrays[arrayIndex] = context->createVertexArray();
7321 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007323 }
7324 catch(std::bad_alloc&)
7325 {
7326 return gl::error(GL_OUT_OF_MEMORY);
7327 }
7328}
7329
7330GLboolean __stdcall glIsVertexArray(GLuint array)
7331{
7332 EVENT("(GLuint array = %u)", array);
7333
7334 try
7335 {
7336 gl::Context *context = gl::getNonLostContext();
7337
7338 if (context)
7339 {
7340 if (context->getClientVersion() < 3)
7341 {
7342 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7343 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007344
Jamie Madilld1028542013-07-02 11:57:04 -04007345 if (array == 0)
7346 {
7347 return GL_FALSE;
7348 }
7349
7350 gl::VertexArray *vao = context->getVertexArray(array);
7351
7352 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007353 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007354 }
7355 catch(std::bad_alloc&)
7356 {
7357 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7358 }
7359
7360 return GL_FALSE;
7361}
7362
7363void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7364{
7365 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7366 target, index, data);
7367
7368 try
7369 {
7370 gl::Context *context = gl::getNonLostContext();
7371
7372 if (context)
7373 {
7374 if (context->getClientVersion() < 3)
7375 {
7376 return gl::error(GL_INVALID_OPERATION);
7377 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007378
Shannon Woods15934d52013-08-19 14:28:49 -04007379 switch (target)
7380 {
7381 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7382 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7383 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7384 if (index >= context->getMaxTransformFeedbackBufferBindings())
7385 return gl::error(GL_INVALID_VALUE);
7386 break;
7387 case GL_UNIFORM_BUFFER_START:
7388 case GL_UNIFORM_BUFFER_SIZE:
7389 case GL_UNIFORM_BUFFER_BINDING:
7390 if (index >= context->getMaximumCombinedUniformBufferBindings())
7391 return gl::error(GL_INVALID_VALUE);
7392 break;
7393 default:
7394 return gl::error(GL_INVALID_ENUM);
7395 }
7396
7397 if (!(context->getIndexedIntegerv(target, index, data)))
7398 {
7399 GLenum nativeType;
7400 unsigned int numParams = 0;
7401 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7402 return gl::error(GL_INVALID_ENUM);
7403
7404 if (numParams == 0)
7405 return; // it is known that pname is valid, but there are no parameters to return
7406
7407 if (nativeType == GL_INT_64_ANGLEX)
7408 {
7409 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7410 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7411 GLint64 *int64Params = new GLint64[numParams];
7412
7413 context->getIndexedInteger64v(target, index, int64Params);
7414
7415 for (unsigned int i = 0; i < numParams; ++i)
7416 {
7417 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7418 data[i] = static_cast<GLint>(clampedValue);
7419 }
7420
7421 delete [] int64Params;
7422 }
7423 else
7424 {
7425 UNREACHABLE();
7426 }
7427 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007429 }
7430 catch(std::bad_alloc&)
7431 {
7432 return gl::error(GL_OUT_OF_MEMORY);
7433 }
7434}
7435
7436void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7437{
7438 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7439
7440 try
7441 {
7442 gl::Context *context = gl::getNonLostContext();
7443
7444 if (context)
7445 {
7446 if (context->getClientVersion() < 3)
7447 {
7448 return gl::error(GL_INVALID_OPERATION);
7449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007450
Geoff Langc8058452014-02-03 12:04:11 -05007451 switch (primitiveMode)
7452 {
7453 case GL_TRIANGLES:
7454 case GL_LINES:
7455 case GL_POINTS:
7456 break;
7457 default:
7458 return gl::error(GL_INVALID_ENUM);
7459 }
7460
7461 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7462 ASSERT(transformFeedback != NULL);
7463
7464 if (transformFeedback->isStarted())
7465 {
7466 return gl::error(GL_INVALID_OPERATION);
7467 }
7468
7469 if (transformFeedback->isPaused())
7470 {
7471 transformFeedback->resume();
7472 }
7473 else
7474 {
7475 transformFeedback->start(primitiveMode);
7476 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007478 }
7479 catch(std::bad_alloc&)
7480 {
7481 return gl::error(GL_OUT_OF_MEMORY);
7482 }
7483}
7484
7485void __stdcall glEndTransformFeedback(void)
7486{
7487 EVENT("(void)");
7488
7489 try
7490 {
7491 gl::Context *context = gl::getNonLostContext();
7492
7493 if (context)
7494 {
7495 if (context->getClientVersion() < 3)
7496 {
7497 return gl::error(GL_INVALID_OPERATION);
7498 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007499
Geoff Langc8058452014-02-03 12:04:11 -05007500 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7501 ASSERT(transformFeedback != NULL);
7502
7503 if (!transformFeedback->isStarted())
7504 {
7505 return gl::error(GL_INVALID_OPERATION);
7506 }
7507
7508 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007510 }
7511 catch(std::bad_alloc&)
7512 {
7513 return gl::error(GL_OUT_OF_MEMORY);
7514 }
7515}
7516
7517void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7518{
7519 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7520 target, index, buffer, offset, size);
7521
7522 try
7523 {
7524 gl::Context *context = gl::getNonLostContext();
7525
7526 if (context)
7527 {
7528 if (context->getClientVersion() < 3)
7529 {
7530 return gl::error(GL_INVALID_OPERATION);
7531 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007532
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007533 switch (target)
7534 {
7535 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007536 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007537 {
7538 return gl::error(GL_INVALID_VALUE);
7539 }
7540 break;
7541
7542 case GL_UNIFORM_BUFFER:
7543 if (index >= context->getMaximumCombinedUniformBufferBindings())
7544 {
7545 return gl::error(GL_INVALID_VALUE);
7546 }
7547 break;
7548
7549 default:
7550 return gl::error(GL_INVALID_ENUM);
7551 }
7552
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007553 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007554 {
7555 return gl::error(GL_INVALID_VALUE);
7556 }
7557
7558 switch (target)
7559 {
7560 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007561
7562 // size and offset must be a multiple of 4
7563 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7564 {
7565 return gl::error(GL_INVALID_VALUE);
7566 }
7567
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007568 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7569 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007570 break;
7571
7572 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007573
7574 // it is an error to bind an offset not a multiple of the alignment
7575 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7576 {
7577 return gl::error(GL_INVALID_VALUE);
7578 }
7579
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007580 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7581 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007582 break;
7583
7584 default:
7585 UNREACHABLE();
7586 }
7587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007588 }
7589 catch(std::bad_alloc&)
7590 {
7591 return gl::error(GL_OUT_OF_MEMORY);
7592 }
7593}
7594
7595void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7596{
7597 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7598 target, index, buffer);
7599
7600 try
7601 {
7602 gl::Context *context = gl::getNonLostContext();
7603
7604 if (context)
7605 {
7606 if (context->getClientVersion() < 3)
7607 {
7608 return gl::error(GL_INVALID_OPERATION);
7609 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007610
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007611 switch (target)
7612 {
7613 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007614 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007615 {
7616 return gl::error(GL_INVALID_VALUE);
7617 }
7618 break;
7619
7620 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007621 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007622 {
7623 return gl::error(GL_INVALID_VALUE);
7624 }
7625 break;
7626
7627 default:
7628 return gl::error(GL_INVALID_ENUM);
7629 }
7630
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007631 switch (target)
7632 {
7633 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007634 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007635 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007636 break;
7637
7638 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007639 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007640 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007641 break;
7642
7643 default:
7644 UNREACHABLE();
7645 }
7646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007647 }
7648 catch(std::bad_alloc&)
7649 {
7650 return gl::error(GL_OUT_OF_MEMORY);
7651 }
7652}
7653
7654void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7655{
7656 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7657 program, count, varyings, bufferMode);
7658
7659 try
7660 {
7661 gl::Context *context = gl::getNonLostContext();
7662
7663 if (context)
7664 {
7665 if (context->getClientVersion() < 3)
7666 {
7667 return gl::error(GL_INVALID_OPERATION);
7668 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007669
Jamie Madill54133512013-06-21 09:33:07 -04007670 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007671 UNIMPLEMENTED();
7672 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007673 }
7674 catch(std::bad_alloc&)
7675 {
7676 return gl::error(GL_OUT_OF_MEMORY);
7677 }
7678}
7679
7680void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7681{
7682 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7683 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7684 program, index, bufSize, length, size, type, name);
7685
7686 try
7687 {
7688 gl::Context *context = gl::getNonLostContext();
7689
7690 if (context)
7691 {
7692 if (context->getClientVersion() < 3)
7693 {
7694 return gl::error(GL_INVALID_OPERATION);
7695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007696
Jamie Madill54133512013-06-21 09:33:07 -04007697 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007698 UNIMPLEMENTED();
7699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007700 }
7701 catch(std::bad_alloc&)
7702 {
7703 return gl::error(GL_OUT_OF_MEMORY);
7704 }
7705}
7706
7707void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7708{
7709 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7710 index, size, type, stride, pointer);
7711
7712 try
7713 {
7714 gl::Context *context = gl::getNonLostContext();
7715
7716 if (context)
7717 {
7718 if (context->getClientVersion() < 3)
7719 {
7720 return gl::error(GL_INVALID_OPERATION);
7721 }
7722 }
7723
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007724 if (index >= gl::MAX_VERTEX_ATTRIBS)
7725 {
7726 return gl::error(GL_INVALID_VALUE);
7727 }
7728
7729 if (size < 1 || size > 4)
7730 {
7731 return gl::error(GL_INVALID_VALUE);
7732 }
7733
7734 switch (type)
7735 {
7736 case GL_BYTE:
7737 case GL_UNSIGNED_BYTE:
7738 case GL_SHORT:
7739 case GL_UNSIGNED_SHORT:
7740 case GL_INT:
7741 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007742 case GL_INT_2_10_10_10_REV:
7743 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007744 break;
7745 default:
7746 return gl::error(GL_INVALID_ENUM);
7747 }
7748
7749 if (stride < 0)
7750 {
7751 return gl::error(GL_INVALID_VALUE);
7752 }
7753
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007754 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7755 {
7756 return gl::error(GL_INVALID_OPERATION);
7757 }
7758
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007759 if (context)
7760 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007761 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7762 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7763 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7764 // and the pointer argument is not NULL.
7765 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7766 {
7767 return gl::error(GL_INVALID_OPERATION);
7768 }
7769
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007770 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7771 stride, pointer);
7772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007773 }
7774 catch(std::bad_alloc&)
7775 {
7776 return gl::error(GL_OUT_OF_MEMORY);
7777 }
7778}
7779
7780void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7781{
7782 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7783 index, pname, params);
7784
7785 try
7786 {
7787 gl::Context *context = gl::getNonLostContext();
7788
7789 if (context)
7790 {
7791 if (context->getClientVersion() < 3)
7792 {
7793 return gl::error(GL_INVALID_OPERATION);
7794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007795
Jamie Madilla7d05862013-07-02 11:57:06 -04007796 if (index >= gl::MAX_VERTEX_ATTRIBS)
7797 {
7798 return gl::error(GL_INVALID_VALUE);
7799 }
7800
7801 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7802
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007803 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007804 {
7805 return;
7806 }
7807
7808 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7809 {
7810 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7811 for (int i = 0; i < 4; ++i)
7812 {
7813 params[i] = currentValueData.IntValues[i];
7814 }
7815 }
7816 else
7817 {
7818 *params = attribState.querySingleParameter<GLint>(pname);
7819 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007821 }
7822 catch(std::bad_alloc&)
7823 {
7824 return gl::error(GL_OUT_OF_MEMORY);
7825 }
7826}
7827
7828void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7829{
7830 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7831 index, pname, params);
7832
7833 try
7834 {
7835 gl::Context *context = gl::getNonLostContext();
7836
7837 if (context)
7838 {
7839 if (context->getClientVersion() < 3)
7840 {
7841 return gl::error(GL_INVALID_OPERATION);
7842 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007843
Jamie Madilla7d05862013-07-02 11:57:06 -04007844 if (index >= gl::MAX_VERTEX_ATTRIBS)
7845 {
7846 return gl::error(GL_INVALID_VALUE);
7847 }
7848
7849 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7850
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007851 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007852 {
7853 return;
7854 }
7855
7856 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7857 {
7858 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7859 for (int i = 0; i < 4; ++i)
7860 {
7861 params[i] = currentValueData.UnsignedIntValues[i];
7862 }
7863 }
7864 else
7865 {
7866 *params = attribState.querySingleParameter<GLuint>(pname);
7867 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007869 }
7870 catch(std::bad_alloc&)
7871 {
7872 return gl::error(GL_OUT_OF_MEMORY);
7873 }
7874}
7875
7876void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7877{
7878 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7879 index, x, y, z, w);
7880
7881 try
7882 {
7883 gl::Context *context = gl::getNonLostContext();
7884
7885 if (context)
7886 {
7887 if (context->getClientVersion() < 3)
7888 {
7889 return gl::error(GL_INVALID_OPERATION);
7890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007891
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007892 if (index >= gl::MAX_VERTEX_ATTRIBS)
7893 {
7894 return gl::error(GL_INVALID_VALUE);
7895 }
7896
7897 GLint vals[4] = { x, y, z, w };
7898 context->setVertexAttribi(index, vals);
7899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007900 }
7901 catch(std::bad_alloc&)
7902 {
7903 return gl::error(GL_OUT_OF_MEMORY);
7904 }
7905}
7906
7907void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7908{
7909 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7910 index, x, y, z, w);
7911
7912 try
7913 {
7914 gl::Context *context = gl::getNonLostContext();
7915
7916 if (context)
7917 {
7918 if (context->getClientVersion() < 3)
7919 {
7920 return gl::error(GL_INVALID_OPERATION);
7921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007922
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007923 if (index >= gl::MAX_VERTEX_ATTRIBS)
7924 {
7925 return gl::error(GL_INVALID_VALUE);
7926 }
7927
7928 GLuint vals[4] = { x, y, z, w };
7929 context->setVertexAttribu(index, vals);
7930 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007931 }
7932 catch(std::bad_alloc&)
7933 {
7934 return gl::error(GL_OUT_OF_MEMORY);
7935 }
7936}
7937
7938void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7939{
7940 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7941
7942 try
7943 {
7944 gl::Context *context = gl::getNonLostContext();
7945
7946 if (context)
7947 {
7948 if (context->getClientVersion() < 3)
7949 {
7950 return gl::error(GL_INVALID_OPERATION);
7951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007952
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007953 if (index >= gl::MAX_VERTEX_ATTRIBS)
7954 {
7955 return gl::error(GL_INVALID_VALUE);
7956 }
7957
7958 context->setVertexAttribi(index, v);
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
7967void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7968{
7969 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7970
7971 try
7972 {
7973 gl::Context *context = gl::getNonLostContext();
7974
7975 if (context)
7976 {
7977 if (context->getClientVersion() < 3)
7978 {
7979 return gl::error(GL_INVALID_OPERATION);
7980 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007981
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007982 if (index >= gl::MAX_VERTEX_ATTRIBS)
7983 {
7984 return gl::error(GL_INVALID_VALUE);
7985 }
7986
7987 context->setVertexAttribu(index, v);
7988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007989 }
7990 catch(std::bad_alloc&)
7991 {
7992 return gl::error(GL_OUT_OF_MEMORY);
7993 }
7994}
7995
7996void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7997{
7998 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7999 program, location, params);
8000
8001 try
8002 {
8003 gl::Context *context = gl::getNonLostContext();
8004
8005 if (context)
8006 {
8007 if (context->getClientVersion() < 3)
8008 {
8009 return gl::error(GL_INVALID_OPERATION);
8010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008011
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008012 if (program == 0)
8013 {
8014 return gl::error(GL_INVALID_VALUE);
8015 }
8016
8017 gl::Program *programObject = context->getProgram(program);
8018
8019 if (!programObject || !programObject->isLinked())
8020 {
8021 return gl::error(GL_INVALID_OPERATION);
8022 }
8023
8024 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8025 if (!programBinary)
8026 {
8027 return gl::error(GL_INVALID_OPERATION);
8028 }
8029
8030 if (!programBinary->getUniformuiv(location, NULL, params))
8031 {
8032 return gl::error(GL_INVALID_OPERATION);
8033 }
8034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008035 }
8036 catch(std::bad_alloc&)
8037 {
8038 return gl::error(GL_OUT_OF_MEMORY);
8039 }
8040}
8041
8042GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8043{
8044 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8045 program, name);
8046
8047 try
8048 {
8049 gl::Context *context = gl::getNonLostContext();
8050
8051 if (context)
8052 {
8053 if (context->getClientVersion() < 3)
8054 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008055 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008057
Jamie Madilld1e78c92013-06-20 11:55:50 -04008058 if (program == 0)
8059 {
8060 return gl::error(GL_INVALID_VALUE, -1);
8061 }
8062
8063 gl::Program *programObject = context->getProgram(program);
8064
8065 if (!programObject || !programObject->isLinked())
8066 {
8067 return gl::error(GL_INVALID_OPERATION, -1);
8068 }
8069
8070 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8071 if (!programBinary)
8072 {
8073 return gl::error(GL_INVALID_OPERATION, -1);
8074 }
8075
8076 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008078 }
8079 catch(std::bad_alloc&)
8080 {
8081 return gl::error(GL_OUT_OF_MEMORY, 0);
8082 }
8083
8084 return 0;
8085}
8086
8087void __stdcall glUniform1ui(GLint location, GLuint v0)
8088{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008089 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008090}
8091
8092void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8093{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008094 const GLuint xy[] = { v0, v1 };
8095 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008096}
8097
8098void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8099{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008100 const GLuint xyz[] = { v0, v1, v2 };
8101 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008102}
8103
8104void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8105{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008106 const GLuint xyzw[] = { v0, v1, v2, v3 };
8107 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108}
8109
8110void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8111{
8112 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8113 location, count, value);
8114
8115 try
8116 {
8117 gl::Context *context = gl::getNonLostContext();
8118
8119 if (context)
8120 {
8121 if (context->getClientVersion() < 3)
8122 {
8123 return gl::error(GL_INVALID_OPERATION);
8124 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008125
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008126 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8127 if (!programBinary)
8128 {
8129 return gl::error(GL_INVALID_OPERATION);
8130 }
8131
8132 if (!programBinary->setUniform1uiv(location, count, value))
8133 {
8134 return gl::error(GL_INVALID_OPERATION);
8135 }
8136 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008137 }
8138 catch(std::bad_alloc&)
8139 {
8140 return gl::error(GL_OUT_OF_MEMORY);
8141 }
8142}
8143
8144void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8145{
8146 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8147 location, count, value);
8148
8149 try
8150 {
8151 gl::Context *context = gl::getNonLostContext();
8152
8153 if (context)
8154 {
8155 if (context->getClientVersion() < 3)
8156 {
8157 return gl::error(GL_INVALID_OPERATION);
8158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008159
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008160 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8161 if (!programBinary)
8162 {
8163 return gl::error(GL_INVALID_OPERATION);
8164 }
8165
8166 if (!programBinary->setUniform2uiv(location, count, value))
8167 {
8168 return gl::error(GL_INVALID_OPERATION);
8169 }
8170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008171 }
8172 catch(std::bad_alloc&)
8173 {
8174 return gl::error(GL_OUT_OF_MEMORY);
8175 }
8176}
8177
8178void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8179{
8180 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8181 location, count, value);
8182
8183 try
8184 {
8185 gl::Context *context = gl::getNonLostContext();
8186
8187 if (context)
8188 {
8189 if (context->getClientVersion() < 3)
8190 {
8191 return gl::error(GL_INVALID_OPERATION);
8192 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008193
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008194 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8195 if (!programBinary)
8196 {
8197 return gl::error(GL_INVALID_OPERATION);
8198 }
8199
8200 if (!programBinary->setUniform3uiv(location, count, value))
8201 {
8202 return gl::error(GL_INVALID_OPERATION);
8203 }
8204 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008205 }
8206 catch(std::bad_alloc&)
8207 {
8208 return gl::error(GL_OUT_OF_MEMORY);
8209 }
8210}
8211
8212void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8213{
8214 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8215 location, count, value);
8216
8217 try
8218 {
8219 gl::Context *context = gl::getNonLostContext();
8220
8221 if (context)
8222 {
8223 if (context->getClientVersion() < 3)
8224 {
8225 return gl::error(GL_INVALID_OPERATION);
8226 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008227
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008228 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8229 if (!programBinary)
8230 {
8231 return gl::error(GL_INVALID_OPERATION);
8232 }
8233
8234 if (!programBinary->setUniform4uiv(location, count, value))
8235 {
8236 return gl::error(GL_INVALID_OPERATION);
8237 }
8238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008239 }
8240 catch(std::bad_alloc&)
8241 {
8242 return gl::error(GL_OUT_OF_MEMORY);
8243 }
8244}
8245
8246void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8247{
8248 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8249 buffer, drawbuffer, value);
8250
8251 try
8252 {
8253 gl::Context *context = gl::getNonLostContext();
8254
8255 if (context)
8256 {
8257 if (context->getClientVersion() < 3)
8258 {
8259 return gl::error(GL_INVALID_OPERATION);
8260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008261
Geoff Lang42359ca2013-08-21 13:25:17 -04008262 switch (buffer)
8263 {
8264 case GL_COLOR:
8265 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8266 {
8267 return gl::error(GL_INVALID_VALUE);
8268 }
8269 break;
8270 case GL_STENCIL:
8271 if (drawbuffer != 0)
8272 {
8273 return gl::error(GL_INVALID_VALUE);
8274 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008275 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008276 default:
8277 return gl::error(GL_INVALID_ENUM);
8278 }
8279
8280 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008282 }
8283 catch(std::bad_alloc&)
8284 {
8285 return gl::error(GL_OUT_OF_MEMORY);
8286 }
8287}
8288
8289void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8290{
8291 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8292 buffer, drawbuffer, value);
8293
8294 try
8295 {
8296 gl::Context *context = gl::getNonLostContext();
8297
8298 if (context)
8299 {
8300 if (context->getClientVersion() < 3)
8301 {
8302 return gl::error(GL_INVALID_OPERATION);
8303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008304
Geoff Lang42359ca2013-08-21 13:25:17 -04008305 switch (buffer)
8306 {
8307 case GL_COLOR:
8308 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8309 {
8310 return gl::error(GL_INVALID_VALUE);
8311 }
8312 break;
8313 default:
8314 return gl::error(GL_INVALID_ENUM);
8315 }
8316
8317 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008319 }
8320 catch(std::bad_alloc&)
8321 {
8322 return gl::error(GL_OUT_OF_MEMORY);
8323 }
8324}
8325
8326void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8327{
8328 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8329 buffer, drawbuffer, value);
8330
8331 try
8332 {
8333 gl::Context *context = gl::getNonLostContext();
8334
8335 if (context)
8336 {
8337 if (context->getClientVersion() < 3)
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341
Geoff Lang42359ca2013-08-21 13:25:17 -04008342 switch (buffer)
8343 {
8344 case GL_COLOR:
8345 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8346 {
8347 return gl::error(GL_INVALID_VALUE);
8348 }
8349 break;
8350 case GL_DEPTH:
8351 if (drawbuffer != 0)
8352 {
8353 return gl::error(GL_INVALID_VALUE);
8354 }
8355 break;
8356 default:
8357 return gl::error(GL_INVALID_ENUM);
8358 }
8359
8360 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008362 }
8363 catch(std::bad_alloc&)
8364 {
8365 return gl::error(GL_OUT_OF_MEMORY);
8366 }
8367}
8368
8369void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8370{
8371 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8372 buffer, drawbuffer, depth, stencil);
8373
8374 try
8375 {
8376 gl::Context *context = gl::getNonLostContext();
8377
8378 if (context)
8379 {
8380 if (context->getClientVersion() < 3)
8381 {
8382 return gl::error(GL_INVALID_OPERATION);
8383 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008384
Geoff Lang42359ca2013-08-21 13:25:17 -04008385 switch (buffer)
8386 {
8387 case GL_DEPTH_STENCIL:
8388 if (drawbuffer != 0)
8389 {
8390 return gl::error(GL_INVALID_VALUE);
8391 }
8392 break;
8393 default:
8394 return gl::error(GL_INVALID_ENUM);
8395 }
8396
8397 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008398 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008399 }
8400 catch(std::bad_alloc&)
8401 {
8402 return gl::error(GL_OUT_OF_MEMORY);
8403 }
8404}
8405
8406const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8407{
8408 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8409
8410 try
8411 {
8412 gl::Context *context = gl::getNonLostContext();
8413
8414 if (context)
8415 {
8416 if (context->getClientVersion() < 3)
8417 {
8418 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008420
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008421 if (name != GL_EXTENSIONS)
8422 {
8423 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8424 }
8425
8426 if (index >= context->getNumExtensions())
8427 {
8428 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8429 }
8430
8431 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008433 }
8434 catch(std::bad_alloc&)
8435 {
8436 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8437 }
8438
8439 return NULL;
8440}
8441
8442void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8443{
8444 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8445 readTarget, writeTarget, readOffset, writeOffset, size);
8446
8447 try
8448 {
8449 gl::Context *context = gl::getNonLostContext();
8450
8451 if (context)
8452 {
8453 if (context->getClientVersion() < 3)
8454 {
8455 return gl::error(GL_INVALID_OPERATION);
8456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008457
Jamie Madill8c96d582014-03-05 15:01:23 -05008458 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008459 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008460 return gl::error(GL_INVALID_ENUM);
8461 }
8462
Jamie Madill8c96d582014-03-05 15:01:23 -05008463 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8464 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008465
8466 if (!readBuffer || !writeBuffer)
8467 {
8468 return gl::error(GL_INVALID_OPERATION);
8469 }
8470
Jamie Madill7a5f7382014-03-05 15:01:24 -05008471 if (readBuffer->mapped() || writeBuffer->mapped())
8472 {
8473 return gl::error(GL_INVALID_OPERATION);
8474 }
8475
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008476 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8477 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8478 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8479 {
8480 return gl::error(GL_INVALID_VALUE);
8481 }
8482
8483 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8484 {
8485 return gl::error(GL_INVALID_VALUE);
8486 }
8487
8488 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8489
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008490 // if size is zero, the copy is a successful no-op
8491 if (size > 0)
8492 {
8493 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8494 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008495 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008496 }
8497 catch(std::bad_alloc&)
8498 {
8499 return gl::error(GL_OUT_OF_MEMORY);
8500 }
8501}
8502
8503void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8504{
8505 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8506 program, uniformCount, uniformNames, uniformIndices);
8507
8508 try
8509 {
8510 gl::Context *context = gl::getNonLostContext();
8511
8512 if (context)
8513 {
8514 if (context->getClientVersion() < 3)
8515 {
8516 return gl::error(GL_INVALID_OPERATION);
8517 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008518
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008519 if (uniformCount < 0)
8520 {
8521 return gl::error(GL_INVALID_VALUE);
8522 }
8523
8524 gl::Program *programObject = context->getProgram(program);
8525
8526 if (!programObject)
8527 {
8528 if (context->getShader(program))
8529 {
8530 return gl::error(GL_INVALID_OPERATION);
8531 }
8532 else
8533 {
8534 return gl::error(GL_INVALID_VALUE);
8535 }
8536 }
8537
8538 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8539 if (!programObject->isLinked() || !programBinary)
8540 {
8541 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8542 {
8543 uniformIndices[uniformId] = GL_INVALID_INDEX;
8544 }
8545 }
8546 else
8547 {
8548 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8549 {
8550 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8551 }
8552 }
8553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008554 }
8555 catch(std::bad_alloc&)
8556 {
8557 return gl::error(GL_OUT_OF_MEMORY);
8558 }
8559}
8560
8561void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8562{
8563 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8564 program, uniformCount, uniformIndices, pname, params);
8565
8566 try
8567 {
8568 gl::Context *context = gl::getNonLostContext();
8569
8570 if (context)
8571 {
8572 if (context->getClientVersion() < 3)
8573 {
8574 return gl::error(GL_INVALID_OPERATION);
8575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008576
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008577 if (uniformCount < 0)
8578 {
8579 return gl::error(GL_INVALID_VALUE);
8580 }
8581
8582 gl::Program *programObject = context->getProgram(program);
8583
8584 if (!programObject)
8585 {
8586 if (context->getShader(program))
8587 {
8588 return gl::error(GL_INVALID_OPERATION);
8589 }
8590 else
8591 {
8592 return gl::error(GL_INVALID_VALUE);
8593 }
8594 }
8595
8596 switch (pname)
8597 {
8598 case GL_UNIFORM_TYPE:
8599 case GL_UNIFORM_SIZE:
8600 case GL_UNIFORM_NAME_LENGTH:
8601 case GL_UNIFORM_BLOCK_INDEX:
8602 case GL_UNIFORM_OFFSET:
8603 case GL_UNIFORM_ARRAY_STRIDE:
8604 case GL_UNIFORM_MATRIX_STRIDE:
8605 case GL_UNIFORM_IS_ROW_MAJOR:
8606 break;
8607 default:
8608 return gl::error(GL_INVALID_ENUM);
8609 }
8610
8611 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8612
8613 if (!programBinary && uniformCount > 0)
8614 {
8615 return gl::error(GL_INVALID_VALUE);
8616 }
8617
8618 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8619 {
8620 const GLuint index = uniformIndices[uniformId];
8621
8622 if (index >= (GLuint)programBinary->getActiveUniformCount())
8623 {
8624 return gl::error(GL_INVALID_VALUE);
8625 }
8626 }
8627
8628 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8629 {
8630 const GLuint index = uniformIndices[uniformId];
8631 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8632 }
8633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008634 }
8635 catch(std::bad_alloc&)
8636 {
8637 return gl::error(GL_OUT_OF_MEMORY);
8638 }
8639}
8640
8641GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8642{
8643 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8644
8645 try
8646 {
8647 gl::Context *context = gl::getNonLostContext();
8648
8649 if (context)
8650 {
8651 if (context->getClientVersion() < 3)
8652 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008653 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008655
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008656 gl::Program *programObject = context->getProgram(program);
8657
8658 if (!programObject)
8659 {
8660 if (context->getShader(program))
8661 {
8662 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8663 }
8664 else
8665 {
8666 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8667 }
8668 }
8669
8670 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8671 if (!programBinary)
8672 {
8673 return GL_INVALID_INDEX;
8674 }
8675
8676 return programBinary->getUniformBlockIndex(uniformBlockName);
8677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008678 }
8679 catch(std::bad_alloc&)
8680 {
8681 return gl::error(GL_OUT_OF_MEMORY, 0);
8682 }
8683
8684 return 0;
8685}
8686
8687void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8688{
8689 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8690 program, uniformBlockIndex, pname, params);
8691
8692 try
8693 {
8694 gl::Context *context = gl::getNonLostContext();
8695
8696 if (context)
8697 {
8698 if (context->getClientVersion() < 3)
8699 {
8700 return gl::error(GL_INVALID_OPERATION);
8701 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008702 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008703
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008704 if (!programObject)
8705 {
8706 if (context->getShader(program))
8707 {
8708 return gl::error(GL_INVALID_OPERATION);
8709 }
8710 else
8711 {
8712 return gl::error(GL_INVALID_VALUE);
8713 }
8714 }
8715
8716 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8717
8718 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8719 {
8720 return gl::error(GL_INVALID_VALUE);
8721 }
8722
8723 switch (pname)
8724 {
8725 case GL_UNIFORM_BLOCK_BINDING:
8726 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8727 break;
8728
8729 case GL_UNIFORM_BLOCK_DATA_SIZE:
8730 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8731 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8732 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8733 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8734 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8735 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8736 break;
8737
8738 default:
8739 return gl::error(GL_INVALID_ENUM);
8740 }
8741 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008742 }
8743 catch(std::bad_alloc&)
8744 {
8745 return gl::error(GL_OUT_OF_MEMORY);
8746 }
8747}
8748
8749void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8750{
8751 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8752 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8753
8754 try
8755 {
8756 gl::Context *context = gl::getNonLostContext();
8757
8758 if (context)
8759 {
8760 if (context->getClientVersion() < 3)
8761 {
8762 return gl::error(GL_INVALID_OPERATION);
8763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008764
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008765 gl::Program *programObject = context->getProgram(program);
8766
8767 if (!programObject)
8768 {
8769 if (context->getShader(program))
8770 {
8771 return gl::error(GL_INVALID_OPERATION);
8772 }
8773 else
8774 {
8775 return gl::error(GL_INVALID_VALUE);
8776 }
8777 }
8778
8779 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8780
8781 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8782 {
8783 return gl::error(GL_INVALID_VALUE);
8784 }
8785
8786 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8787 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008788 }
8789 catch(std::bad_alloc&)
8790 {
8791 return gl::error(GL_OUT_OF_MEMORY);
8792 }
8793}
8794
8795void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8796{
8797 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8798 program, uniformBlockIndex, uniformBlockBinding);
8799
8800 try
8801 {
8802 gl::Context *context = gl::getNonLostContext();
8803
8804 if (context)
8805 {
8806 if (context->getClientVersion() < 3)
8807 {
8808 return gl::error(GL_INVALID_OPERATION);
8809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008810
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008811 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8812 {
8813 return gl::error(GL_INVALID_VALUE);
8814 }
8815
8816 gl::Program *programObject = context->getProgram(program);
8817
8818 if (!programObject)
8819 {
8820 if (context->getShader(program))
8821 {
8822 return gl::error(GL_INVALID_OPERATION);
8823 }
8824 else
8825 {
8826 return gl::error(GL_INVALID_VALUE);
8827 }
8828 }
8829
8830 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8831
8832 // if never linked, there won't be any uniform blocks
8833 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8834 {
8835 return gl::error(GL_INVALID_VALUE);
8836 }
8837
8838 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008840 }
8841 catch(std::bad_alloc&)
8842 {
8843 return gl::error(GL_OUT_OF_MEMORY);
8844 }
8845}
8846
8847void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8848{
8849 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8850 mode, first, count, instanceCount);
8851
8852 try
8853 {
8854 gl::Context *context = gl::getNonLostContext();
8855
8856 if (context)
8857 {
8858 if (context->getClientVersion() < 3)
8859 {
8860 return gl::error(GL_INVALID_OPERATION);
8861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008862
Jamie Madill54133512013-06-21 09:33:07 -04008863 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008864 UNIMPLEMENTED();
8865 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008866 }
8867 catch(std::bad_alloc&)
8868 {
8869 return gl::error(GL_OUT_OF_MEMORY);
8870 }
8871}
8872
8873void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8874{
8875 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8876 mode, count, type, indices, instanceCount);
8877
8878 try
8879 {
8880 gl::Context *context = gl::getNonLostContext();
8881
8882 if (context)
8883 {
8884 if (context->getClientVersion() < 3)
8885 {
8886 return gl::error(GL_INVALID_OPERATION);
8887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008888
Jamie Madill54133512013-06-21 09:33:07 -04008889 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008890 UNIMPLEMENTED();
8891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008892 }
8893 catch(std::bad_alloc&)
8894 {
8895 return gl::error(GL_OUT_OF_MEMORY);
8896 }
8897}
8898
8899GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8900{
8901 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8902
8903 try
8904 {
8905 gl::Context *context = gl::getNonLostContext();
8906
8907 if (context)
8908 {
8909 if (context->getClientVersion() < 3)
8910 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008911 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008913
Jamie Madill5215e1a2013-07-26 11:55:19 -04008914 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8915 {
8916 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8917 }
8918
8919 if (flags != 0)
8920 {
8921 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8922 }
8923
8924 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008925 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008926 }
8927 catch(std::bad_alloc&)
8928 {
8929 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8930 }
8931
8932 return NULL;
8933}
8934
8935GLboolean __stdcall glIsSync(GLsync sync)
8936{
8937 EVENT("(GLsync sync = 0x%0.8p)", sync);
8938
8939 try
8940 {
8941 gl::Context *context = gl::getNonLostContext();
8942
8943 if (context)
8944 {
8945 if (context->getClientVersion() < 3)
8946 {
8947 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008949
Jamie Madill5215e1a2013-07-26 11:55:19 -04008950 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008952 }
8953 catch(std::bad_alloc&)
8954 {
8955 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8956 }
8957
8958 return GL_FALSE;
8959}
8960
8961void __stdcall glDeleteSync(GLsync sync)
8962{
8963 EVENT("(GLsync sync = 0x%0.8p)", sync);
8964
8965 try
8966 {
8967 gl::Context *context = gl::getNonLostContext();
8968
8969 if (context)
8970 {
8971 if (context->getClientVersion() < 3)
8972 {
8973 return gl::error(GL_INVALID_OPERATION);
8974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008975
Jamie Madill5215e1a2013-07-26 11:55:19 -04008976 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8977 {
8978 return gl::error(GL_INVALID_VALUE);
8979 }
8980
8981 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008983 }
8984 catch(std::bad_alloc&)
8985 {
8986 return gl::error(GL_OUT_OF_MEMORY);
8987 }
8988}
8989
8990GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8991{
8992 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8993 sync, flags, timeout);
8994
8995 try
8996 {
8997 gl::Context *context = gl::getNonLostContext();
8998
8999 if (context)
9000 {
9001 if (context->getClientVersion() < 3)
9002 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009003 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009005
Jamie Madill5215e1a2013-07-26 11:55:19 -04009006 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9007 {
9008 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9009 }
9010
9011 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9012
9013 if (!fenceSync)
9014 {
9015 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9016 }
9017
9018 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009019 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009020 }
9021 catch(std::bad_alloc&)
9022 {
9023 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9024 }
9025
9026 return GL_FALSE;
9027}
9028
9029void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9030{
9031 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9032 sync, flags, timeout);
9033
9034 try
9035 {
9036 gl::Context *context = gl::getNonLostContext();
9037
9038 if (context)
9039 {
9040 if (context->getClientVersion() < 3)
9041 {
9042 return gl::error(GL_INVALID_OPERATION);
9043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009044
Jamie Madill5215e1a2013-07-26 11:55:19 -04009045 if (flags != 0)
9046 {
9047 return gl::error(GL_INVALID_VALUE);
9048 }
9049
9050 if (timeout != GL_TIMEOUT_IGNORED)
9051 {
9052 return gl::error(GL_INVALID_VALUE);
9053 }
9054
9055 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9056
9057 if (!fenceSync)
9058 {
9059 return gl::error(GL_INVALID_VALUE);
9060 }
9061
9062 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009063 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009064 }
9065 catch(std::bad_alloc&)
9066 {
9067 return gl::error(GL_OUT_OF_MEMORY);
9068 }
9069}
9070
9071void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9072{
9073 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9074 pname, params);
9075
9076 try
9077 {
9078 gl::Context *context = gl::getNonLostContext();
9079
9080 if (context)
9081 {
9082 if (context->getClientVersion() < 3)
9083 {
9084 return gl::error(GL_INVALID_OPERATION);
9085 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009086
Jamie Madill79f2f452013-12-19 11:13:02 -05009087 GLenum nativeType;
9088 unsigned int numParams = 0;
9089 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9090 return gl::error(GL_INVALID_ENUM);
9091
9092 // pname is valid, but that there are no parameters to return.
9093 if (numParams == 0)
9094 return;
9095
9096 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009097 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009098 context->getInteger64v(pname, params);
9099 }
Jamie Madill55856b12014-01-02 13:59:50 -05009100 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009101 {
Jamie Madill55856b12014-01-02 13:59:50 -05009102 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009103 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009104 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009105 }
9106 catch(std::bad_alloc&)
9107 {
9108 return gl::error(GL_OUT_OF_MEMORY);
9109 }
9110}
9111
9112void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9113{
9114 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9115 sync, pname, bufSize, length, values);
9116
9117 try
9118 {
9119 gl::Context *context = gl::getNonLostContext();
9120
9121 if (context)
9122 {
9123 if (context->getClientVersion() < 3)
9124 {
9125 return gl::error(GL_INVALID_OPERATION);
9126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009127
Jamie Madill5215e1a2013-07-26 11:55:19 -04009128 if (bufSize < 0)
9129 {
9130 return gl::error(GL_INVALID_VALUE);
9131 }
9132
9133 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9134
9135 if (!fenceSync)
9136 {
9137 return gl::error(GL_INVALID_VALUE);
9138 }
9139
9140 switch (pname)
9141 {
9142 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9143 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9144 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9145 case GL_SYNC_FLAGS: values[0] = 0; break;
9146
9147 default:
9148 return gl::error(GL_INVALID_ENUM);
9149 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009151 }
9152 catch(std::bad_alloc&)
9153 {
9154 return gl::error(GL_OUT_OF_MEMORY);
9155 }
9156}
9157
9158void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9159{
9160 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9161 target, index, data);
9162
9163 try
9164 {
9165 gl::Context *context = gl::getNonLostContext();
9166
9167 if (context)
9168 {
9169 if (context->getClientVersion() < 3)
9170 {
9171 return gl::error(GL_INVALID_OPERATION);
9172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009173
Shannon Woods15934d52013-08-19 14:28:49 -04009174 switch (target)
9175 {
9176 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9177 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9178 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9179 if (index >= context->getMaxTransformFeedbackBufferBindings())
9180 return gl::error(GL_INVALID_VALUE);
9181 break;
9182 case GL_UNIFORM_BUFFER_START:
9183 case GL_UNIFORM_BUFFER_SIZE:
9184 case GL_UNIFORM_BUFFER_BINDING:
9185 if (index >= context->getMaximumCombinedUniformBufferBindings())
9186 return gl::error(GL_INVALID_VALUE);
9187 break;
9188 default:
9189 return gl::error(GL_INVALID_ENUM);
9190 }
9191
9192 if (!(context->getIndexedInteger64v(target, index, data)))
9193 {
9194 GLenum nativeType;
9195 unsigned int numParams = 0;
9196 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9197 return gl::error(GL_INVALID_ENUM);
9198
9199 if (numParams == 0)
9200 return; // it is known that pname is valid, but there are no parameters to return
9201
9202 if (nativeType == GL_INT)
9203 {
9204 GLint *intParams = new GLint[numParams];
9205
9206 context->getIndexedIntegerv(target, index, intParams);
9207
9208 for (unsigned int i = 0; i < numParams; ++i)
9209 {
9210 data[i] = static_cast<GLint64>(intParams[i]);
9211 }
9212
9213 delete [] intParams;
9214 }
9215 else
9216 {
9217 UNREACHABLE();
9218 }
9219 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009220 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009221 }
9222 catch(std::bad_alloc&)
9223 {
9224 return gl::error(GL_OUT_OF_MEMORY);
9225 }
9226}
9227
9228void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9229{
9230 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9231 target, pname, params);
9232
9233 try
9234 {
9235 gl::Context *context = gl::getNonLostContext();
9236
9237 if (context)
9238 {
9239 if (context->getClientVersion() < 3)
9240 {
9241 return gl::error(GL_INVALID_OPERATION);
9242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009243
Jamie Madill70656a62014-03-05 15:01:26 -05009244 if (!gl::ValidBufferTarget(context, target))
9245 {
9246 return gl::error(GL_INVALID_ENUM);
9247 }
9248
9249 if (!gl::ValidBufferParameter(context, pname))
9250 {
9251 return gl::error(GL_INVALID_ENUM);
9252 }
9253
9254 gl::Buffer *buffer = context->getTargetBuffer(target);
9255
9256 if (!buffer)
9257 {
9258 // A null buffer means that "0" is bound to the requested buffer target
9259 return gl::error(GL_INVALID_OPERATION);
9260 }
9261
9262 switch (pname)
9263 {
9264 case GL_BUFFER_USAGE:
9265 *params = static_cast<GLint64>(buffer->usage());
9266 break;
9267 case GL_BUFFER_SIZE:
9268 *params = buffer->size();
9269 break;
9270 case GL_BUFFER_ACCESS_FLAGS:
9271 *params = static_cast<GLint64>(buffer->accessFlags());
9272 break;
9273 case GL_BUFFER_MAPPED:
9274 *params = static_cast<GLint64>(buffer->mapped());
9275 break;
9276 case GL_BUFFER_MAP_OFFSET:
9277 *params = buffer->mapOffset();
9278 break;
9279 case GL_BUFFER_MAP_LENGTH:
9280 *params = buffer->mapLength();
9281 break;
9282 default: UNREACHABLE(); break;
9283 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009285 }
9286 catch(std::bad_alloc&)
9287 {
9288 return gl::error(GL_OUT_OF_MEMORY);
9289 }
9290}
9291
9292void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9293{
9294 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9295
9296 try
9297 {
9298 gl::Context *context = gl::getNonLostContext();
9299
9300 if (context)
9301 {
9302 if (context->getClientVersion() < 3)
9303 {
9304 return gl::error(GL_INVALID_OPERATION);
9305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009306
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009307 if (count < 0)
9308 {
9309 return gl::error(GL_INVALID_VALUE);
9310 }
9311
9312 for (int i = 0; i < count; i++)
9313 {
9314 samplers[i] = context->createSampler();
9315 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009316 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009317 }
9318 catch(std::bad_alloc&)
9319 {
9320 return gl::error(GL_OUT_OF_MEMORY);
9321 }
9322}
9323
9324void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9325{
9326 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9327
9328 try
9329 {
9330 gl::Context *context = gl::getNonLostContext();
9331
9332 if (context)
9333 {
9334 if (context->getClientVersion() < 3)
9335 {
9336 return gl::error(GL_INVALID_OPERATION);
9337 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009338
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009339 if (count < 0)
9340 {
9341 return gl::error(GL_INVALID_VALUE);
9342 }
9343
9344 for (int i = 0; i < count; i++)
9345 {
9346 context->deleteSampler(samplers[i]);
9347 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009348 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009349 }
9350 catch(std::bad_alloc&)
9351 {
9352 return gl::error(GL_OUT_OF_MEMORY);
9353 }
9354}
9355
9356GLboolean __stdcall glIsSampler(GLuint sampler)
9357{
9358 EVENT("(GLuint sampler = %u)", sampler);
9359
9360 try
9361 {
9362 gl::Context *context = gl::getNonLostContext();
9363
9364 if (context)
9365 {
9366 if (context->getClientVersion() < 3)
9367 {
9368 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9369 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009370
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009371 return context->isSampler(sampler);
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, GL_FALSE);
9377 }
9378
9379 return GL_FALSE;
9380}
9381
9382void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9383{
9384 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9385
9386 try
9387 {
9388 gl::Context *context = gl::getNonLostContext();
9389
9390 if (context)
9391 {
9392 if (context->getClientVersion() < 3)
9393 {
9394 return gl::error(GL_INVALID_OPERATION);
9395 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009396
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009397 if (sampler != 0 && !context->isSampler(sampler))
9398 {
9399 return gl::error(GL_INVALID_OPERATION);
9400 }
9401
9402 if (unit >= context->getMaximumCombinedTextureImageUnits())
9403 {
9404 return gl::error(GL_INVALID_VALUE);
9405 }
9406
9407 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009408 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009409 }
9410 catch(std::bad_alloc&)
9411 {
9412 return gl::error(GL_OUT_OF_MEMORY);
9413 }
9414}
9415
9416void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9417{
9418 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9419
9420 try
9421 {
9422 gl::Context *context = gl::getNonLostContext();
9423
9424 if (context)
9425 {
9426 if (context->getClientVersion() < 3)
9427 {
9428 return gl::error(GL_INVALID_OPERATION);
9429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009430
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009431 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009432 {
9433 return;
9434 }
9435
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009436 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009437 {
9438 return;
9439 }
9440
9441 if (!context->isSampler(sampler))
9442 {
9443 return gl::error(GL_INVALID_OPERATION);
9444 }
9445
9446 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009448 }
9449 catch(std::bad_alloc&)
9450 {
9451 return gl::error(GL_OUT_OF_MEMORY);
9452 }
9453}
9454
9455void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9456{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009457 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009458}
9459
9460void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9461{
9462 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9463
9464 try
9465 {
9466 gl::Context *context = gl::getNonLostContext();
9467
9468 if (context)
9469 {
9470 if (context->getClientVersion() < 3)
9471 {
9472 return gl::error(GL_INVALID_OPERATION);
9473 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009474
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009475 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009476 {
9477 return;
9478 }
9479
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009480 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009481 {
9482 return;
9483 }
9484
9485 if (!context->isSampler(sampler))
9486 {
9487 return gl::error(GL_INVALID_OPERATION);
9488 }
9489
9490 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009491 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009492 }
9493 catch(std::bad_alloc&)
9494 {
9495 return gl::error(GL_OUT_OF_MEMORY);
9496 }
9497}
9498
9499void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9500{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009501 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009502}
9503
9504void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9505{
9506 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9507
9508 try
9509 {
9510 gl::Context *context = gl::getNonLostContext();
9511
9512 if (context)
9513 {
9514 if (context->getClientVersion() < 3)
9515 {
9516 return gl::error(GL_INVALID_OPERATION);
9517 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009518
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009519 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009520 {
9521 return;
9522 }
9523
9524 if (!context->isSampler(sampler))
9525 {
9526 return gl::error(GL_INVALID_OPERATION);
9527 }
9528
9529 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009531 }
9532 catch(std::bad_alloc&)
9533 {
9534 return gl::error(GL_OUT_OF_MEMORY);
9535 }
9536}
9537
9538void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9539{
9540 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9541
9542 try
9543 {
9544 gl::Context *context = gl::getNonLostContext();
9545
9546 if (context)
9547 {
9548 if (context->getClientVersion() < 3)
9549 {
9550 return gl::error(GL_INVALID_OPERATION);
9551 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009552
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009553 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009554 {
9555 return;
9556 }
9557
9558 if (!context->isSampler(sampler))
9559 {
9560 return gl::error(GL_INVALID_OPERATION);
9561 }
9562
9563 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009564 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009565 }
9566 catch(std::bad_alloc&)
9567 {
9568 return gl::error(GL_OUT_OF_MEMORY);
9569 }
9570}
9571
9572void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9573{
9574 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9575
9576 try
9577 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009578 if (index >= gl::MAX_VERTEX_ATTRIBS)
9579 {
9580 return gl::error(GL_INVALID_VALUE);
9581 }
9582
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009583 gl::Context *context = gl::getNonLostContext();
9584
9585 if (context)
9586 {
9587 if (context->getClientVersion() < 3)
9588 {
9589 return gl::error(GL_INVALID_OPERATION);
9590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009591
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009592 context->setVertexAttribDivisor(index, divisor);
9593 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009594 }
9595 catch(std::bad_alloc&)
9596 {
9597 return gl::error(GL_OUT_OF_MEMORY);
9598 }
9599}
9600
9601void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9602{
9603 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9604
9605 try
9606 {
9607 gl::Context *context = gl::getNonLostContext();
9608
9609 if (context)
9610 {
9611 if (context->getClientVersion() < 3)
9612 {
9613 return gl::error(GL_INVALID_OPERATION);
9614 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009615
Geoff Langc8058452014-02-03 12:04:11 -05009616 switch (target)
9617 {
9618 case GL_TRANSFORM_FEEDBACK:
9619 {
9620 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9621 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9622 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9623 {
9624 return gl::error(GL_INVALID_OPERATION);
9625 }
9626
9627 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9628 if (context->getTransformFeedback(id) == NULL)
9629 {
9630 return gl::error(GL_INVALID_OPERATION);
9631 }
9632
9633 context->bindTransformFeedback(id);
9634 }
9635 break;
9636
9637 default:
9638 return gl::error(GL_INVALID_ENUM);
9639 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009640 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009641 }
9642 catch(std::bad_alloc&)
9643 {
9644 return gl::error(GL_OUT_OF_MEMORY);
9645 }
9646}
9647
9648void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9649{
9650 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9651
9652 try
9653 {
9654 gl::Context *context = gl::getNonLostContext();
9655
9656 if (context)
9657 {
9658 if (context->getClientVersion() < 3)
9659 {
9660 return gl::error(GL_INVALID_OPERATION);
9661 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009662
Geoff Langc8058452014-02-03 12:04:11 -05009663 for (int i = 0; i < n; i++)
9664 {
9665 context->deleteTransformFeedback(ids[i]);
9666 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009668 }
9669 catch(std::bad_alloc&)
9670 {
9671 return gl::error(GL_OUT_OF_MEMORY);
9672 }
9673}
9674
9675void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9676{
9677 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9678
9679 try
9680 {
9681 gl::Context *context = gl::getNonLostContext();
9682
9683 if (context)
9684 {
9685 if (context->getClientVersion() < 3)
9686 {
9687 return gl::error(GL_INVALID_OPERATION);
9688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009689
Geoff Langc8058452014-02-03 12:04:11 -05009690 for (int i = 0; i < n; i++)
9691 {
9692 ids[i] = context->createTransformFeedback();
9693 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009694 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009695 }
9696 catch(std::bad_alloc&)
9697 {
9698 return gl::error(GL_OUT_OF_MEMORY);
9699 }
9700}
9701
9702GLboolean __stdcall glIsTransformFeedback(GLuint id)
9703{
9704 EVENT("(GLuint id = %u)", id);
9705
9706 try
9707 {
9708 gl::Context *context = gl::getNonLostContext();
9709
9710 if (context)
9711 {
9712 if (context->getClientVersion() < 3)
9713 {
9714 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9715 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009716
Geoff Langc8058452014-02-03 12:04:11 -05009717 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009718 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009719 }
9720 catch(std::bad_alloc&)
9721 {
9722 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9723 }
9724
9725 return GL_FALSE;
9726}
9727
9728void __stdcall glPauseTransformFeedback(void)
9729{
9730 EVENT("(void)");
9731
9732 try
9733 {
9734 gl::Context *context = gl::getNonLostContext();
9735
9736 if (context)
9737 {
9738 if (context->getClientVersion() < 3)
9739 {
9740 return gl::error(GL_INVALID_OPERATION);
9741 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009742
Geoff Langc8058452014-02-03 12:04:11 -05009743 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9744 ASSERT(transformFeedback != NULL);
9745
9746 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9747 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9748 {
9749 return gl::error(GL_INVALID_OPERATION);
9750 }
9751
9752 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009754 }
9755 catch(std::bad_alloc&)
9756 {
9757 return gl::error(GL_OUT_OF_MEMORY);
9758 }
9759}
9760
9761void __stdcall glResumeTransformFeedback(void)
9762{
9763 EVENT("(void)");
9764
9765 try
9766 {
9767 gl::Context *context = gl::getNonLostContext();
9768
9769 if (context)
9770 {
9771 if (context->getClientVersion() < 3)
9772 {
9773 return gl::error(GL_INVALID_OPERATION);
9774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009775
Geoff Langc8058452014-02-03 12:04:11 -05009776 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9777 ASSERT(transformFeedback != NULL);
9778
9779 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9780 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9781 {
9782 return gl::error(GL_INVALID_OPERATION);
9783 }
9784
9785 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009787 }
9788 catch(std::bad_alloc&)
9789 {
9790 return gl::error(GL_OUT_OF_MEMORY);
9791 }
9792}
9793
9794void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9795{
9796 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9797 program, bufSize, length, binaryFormat, binary);
9798
9799 try
9800 {
9801 gl::Context *context = gl::getNonLostContext();
9802
9803 if (context)
9804 {
9805 if (context->getClientVersion() < 3)
9806 {
9807 return gl::error(GL_INVALID_OPERATION);
9808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009809
Jamie Madill54133512013-06-21 09:33:07 -04009810 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009811 UNIMPLEMENTED();
9812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009813 }
9814 catch(std::bad_alloc&)
9815 {
9816 return gl::error(GL_OUT_OF_MEMORY);
9817 }
9818}
9819
9820void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9821{
9822 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9823 program, binaryFormat, binary, length);
9824
9825 try
9826 {
9827 gl::Context *context = gl::getNonLostContext();
9828
9829 if (context)
9830 {
9831 if (context->getClientVersion() < 3)
9832 {
9833 return gl::error(GL_INVALID_OPERATION);
9834 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009835
Jamie Madill54133512013-06-21 09:33:07 -04009836 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009837 UNIMPLEMENTED();
9838 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009839 }
9840 catch(std::bad_alloc&)
9841 {
9842 return gl::error(GL_OUT_OF_MEMORY);
9843 }
9844}
9845
9846void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9847{
9848 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9849 program, pname, value);
9850
9851 try
9852 {
9853 gl::Context *context = gl::getNonLostContext();
9854
9855 if (context)
9856 {
9857 if (context->getClientVersion() < 3)
9858 {
9859 return gl::error(GL_INVALID_OPERATION);
9860 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009861
Jamie Madill54133512013-06-21 09:33:07 -04009862 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009863 UNIMPLEMENTED();
9864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009865 }
9866 catch(std::bad_alloc&)
9867 {
9868 return gl::error(GL_OUT_OF_MEMORY);
9869 }
9870}
9871
9872void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9873{
9874 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9875 target, numAttachments, attachments);
9876
9877 try
9878 {
9879 gl::Context *context = gl::getNonLostContext();
9880
9881 if (context)
9882 {
9883 if (context->getClientVersion() < 3)
9884 {
9885 return gl::error(GL_INVALID_OPERATION);
9886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009887
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009888 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009889 {
9890 return;
9891 }
9892
9893 int maxDimension = context->getMaximumRenderbufferDimension();
9894 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9895 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009896 }
9897 catch(std::bad_alloc&)
9898 {
9899 return gl::error(GL_OUT_OF_MEMORY);
9900 }
9901}
9902
9903void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9904{
9905 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9906 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9907 target, numAttachments, attachments, x, y, width, height);
9908
9909 try
9910 {
9911 gl::Context *context = gl::getNonLostContext();
9912
9913 if (context)
9914 {
9915 if (context->getClientVersion() < 3)
9916 {
9917 return gl::error(GL_INVALID_OPERATION);
9918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009919
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009920 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009921 {
9922 return;
9923 }
9924
9925 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9926 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009927 }
9928 catch(std::bad_alloc&)
9929 {
9930 return gl::error(GL_OUT_OF_MEMORY);
9931 }
9932}
9933
9934void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9935{
9936 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9937 target, levels, internalformat, width, height);
9938
9939 try
9940 {
9941 gl::Context *context = gl::getNonLostContext();
9942
9943 if (context)
9944 {
9945 if (context->getClientVersion() < 3)
9946 {
9947 return gl::error(GL_INVALID_OPERATION);
9948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009949
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009950 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009951 {
9952 return;
9953 }
9954
9955 switch (target)
9956 {
9957 case GL_TEXTURE_2D:
9958 {
9959 gl::Texture2D *texture2d = context->getTexture2D();
9960 texture2d->storage(levels, internalformat, width, height);
9961 }
9962 break;
9963
Geoff Lang01c21d22013-09-24 11:52:16 -04009964 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009965 {
9966 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9967 textureCube->storage(levels, internalformat, width);
9968 }
9969 break;
9970
9971 default:
9972 return gl::error(GL_INVALID_ENUM);
9973 }
9974 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009975 }
9976 catch(std::bad_alloc&)
9977 {
9978 return gl::error(GL_OUT_OF_MEMORY);
9979 }
9980}
9981
9982void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9983{
9984 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9985 "GLsizei height = %d, GLsizei depth = %d)",
9986 target, levels, internalformat, width, height, depth);
9987
9988 try
9989 {
9990 gl::Context *context = gl::getNonLostContext();
9991
9992 if (context)
9993 {
9994 if (context->getClientVersion() < 3)
9995 {
9996 return gl::error(GL_INVALID_OPERATION);
9997 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009998
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009999 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010000 {
10001 return;
10002 }
10003
10004 switch (target)
10005 {
10006 case GL_TEXTURE_3D:
10007 {
10008 gl::Texture3D *texture3d = context->getTexture3D();
10009 texture3d->storage(levels, internalformat, width, height, depth);
10010 }
10011 break;
10012
10013 case GL_TEXTURE_2D_ARRAY:
10014 {
10015 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10016 texture2darray->storage(levels, internalformat, width, height, depth);
10017 }
10018 break;
10019
10020 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010021 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010022 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010024 }
10025 catch(std::bad_alloc&)
10026 {
10027 return gl::error(GL_OUT_OF_MEMORY);
10028 }
10029}
10030
10031void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10032{
10033 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10034 "GLint* params = 0x%0.8p)",
10035 target, internalformat, pname, bufSize, params);
10036
10037 try
10038 {
10039 gl::Context *context = gl::getNonLostContext();
10040
10041 if (context)
10042 {
10043 if (context->getClientVersion() < 3)
10044 {
10045 return gl::error(GL_INVALID_OPERATION);
10046 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010047
Shannon Woods809d2502013-07-08 10:32:18 -040010048 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10049 !gl::IsDepthRenderingSupported(internalformat, context) &&
10050 !gl::IsStencilRenderingSupported(internalformat, context))
10051 {
10052 return gl::error(GL_INVALID_ENUM);
10053 }
10054
10055 if (target != GL_RENDERBUFFER)
10056 {
10057 return gl::error(GL_INVALID_ENUM);
10058 }
10059
10060 if (bufSize < 0)
10061 {
10062 return gl::error(GL_INVALID_VALUE);
10063 }
10064
10065 switch (pname)
10066 {
10067 case GL_NUM_SAMPLE_COUNTS:
10068 if (bufSize != 0)
10069 *params = context->getNumSampleCounts(internalformat);
10070 break;
10071 case GL_SAMPLES:
10072 context->getSampleCounts(internalformat, bufSize, params);
10073 break;
10074 default:
10075 return gl::error(GL_INVALID_ENUM);
10076 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010078 }
10079 catch(std::bad_alloc&)
10080 {
10081 return gl::error(GL_OUT_OF_MEMORY);
10082 }
10083}
10084
10085// Extension functions
10086
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010087void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10088 GLbitfield mask, GLenum filter)
10089{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010090 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010091 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10092 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10093 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10094
10095 try
10096 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010098
10099 if (context)
10100 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010101 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010102 dstX0, dstY0, dstX1, dstY1, mask, filter,
10103 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010104 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010105 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010106 }
10107
Geoff Lang758d5b22013-06-11 11:42:50 -040010108 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10109 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010110 }
10111 }
10112 catch(std::bad_alloc&)
10113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010115 }
10116}
10117
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010118void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10119 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010120{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010121 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010122 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010123 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010124 target, level, internalformat, width, height, depth, border, format, type, pixels);
10125
10126 try
10127 {
10128 UNIMPLEMENTED(); // FIXME
10129 }
10130 catch(std::bad_alloc&)
10131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010133 }
10134}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010135
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010136void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10137 GLenum *binaryFormat, void *binary)
10138{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010139 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 +000010140 program, bufSize, length, binaryFormat, binary);
10141
10142 try
10143 {
10144 gl::Context *context = gl::getNonLostContext();
10145
10146 if (context)
10147 {
10148 gl::Program *programObject = context->getProgram(program);
10149
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010150 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010152 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010153 }
10154
10155 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10156
10157 if (!programBinary)
10158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010159 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010160 }
10161
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010162 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010164 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010165 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010166
10167 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010168 }
10169 }
10170 catch(std::bad_alloc&)
10171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010172 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010173 }
10174}
10175
10176void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10177 const void *binary, GLint length)
10178{
10179 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10180 program, binaryFormat, binary, length);
10181
10182 try
10183 {
10184 gl::Context *context = gl::getNonLostContext();
10185
10186 if (context)
10187 {
10188 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010190 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010191 }
10192
10193 gl::Program *programObject = context->getProgram(program);
10194
10195 if (!programObject)
10196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010197 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010198 }
10199
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010200 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010201 }
10202 }
10203 catch(std::bad_alloc&)
10204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010205 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010206 }
10207}
10208
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010209void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10210{
10211 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10212
10213 try
10214 {
10215 gl::Context *context = gl::getNonLostContext();
10216
10217 if (context)
10218 {
10219 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10220 {
10221 return gl::error(GL_INVALID_VALUE);
10222 }
10223
10224 if (context->getDrawFramebufferHandle() == 0)
10225 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010226 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010227 {
10228 return gl::error(GL_INVALID_OPERATION);
10229 }
10230
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010231 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010232 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010233 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010234 }
10235 }
10236 else
10237 {
10238 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10239 {
10240 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10241 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10242 {
10243 return gl::error(GL_INVALID_OPERATION);
10244 }
10245 }
10246 }
10247
10248 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10249
10250 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10251 {
10252 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10253 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010254
10255 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10256 {
10257 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10258 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010259 }
10260 }
10261 catch (std::bad_alloc&)
10262 {
10263 return gl::error(GL_OUT_OF_MEMORY);
10264 }
10265}
10266
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010267__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10268{
10269 struct Extension
10270 {
10271 const char *name;
10272 __eglMustCastToProperFunctionPointerType address;
10273 };
10274
10275 static const Extension glExtensions[] =
10276 {
10277 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010278 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010279 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010280 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10281 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10282 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10283 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10284 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10285 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10286 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010287 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010288 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010289 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10290 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10291 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10292 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010293 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10294 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10295 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10296 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10297 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10298 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10299 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010300 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010301 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10302 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10303 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010304 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10305 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010306
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010307 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010308 {
10309 if (strcmp(procname, glExtensions[ext].name) == 0)
10310 {
10311 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10312 }
10313 }
10314
10315 return NULL;
10316}
10317
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010318// Non-public functions used by EGL
10319
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010320bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010321{
10322 EVENT("(egl::Surface* surface = 0x%0.8p)",
10323 surface);
10324
10325 try
10326 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010327 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010328
10329 if (context)
10330 {
10331 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010332 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010333
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010334 if (textureObject->isImmutable())
10335 {
10336 return false;
10337 }
10338
Geoff Lang32d508e2014-02-11 09:39:48 -050010339 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010340 }
10341 }
10342 catch(std::bad_alloc&)
10343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010344 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010345 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010346
10347 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010348}
10349
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010350}