blob: 83522f88dfff382031ee629c5df1224c8cf1811d [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
55 catch(std::bad_alloc&)
56 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
104 catch(std::bad_alloc&)
105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Geoff Lang37dde692014-01-31 16:34:54 -0500120 if (!ValidQueryType(context, target))
121 {
122 return gl::error(GL_INVALID_ENUM);
123 }
124
125 if (id == 0)
126 {
127 return gl::error(GL_INVALID_OPERATION);
128 }
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130 context->beginQuery(target, id);
131 }
132 }
133 catch(std::bad_alloc&)
134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000136 }
137}
138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000139void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142
143 try
144 {
145 if (index >= gl::MAX_VERTEX_ATTRIBS)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 if (context)
153 {
154 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156 if (!programObject)
157 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 if (context->getShader(program))
159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000160 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 }
162 else
163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000165 }
166 }
167
168 if (strncmp(name, "gl_", 3) == 0)
169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171 }
172
173 programObject->bindAttributeLocation(index, name);
174 }
175 }
176 catch(std::bad_alloc&)
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179 }
180}
181
182void __stdcall glBindBuffer(GLenum target, GLuint buffer)
183{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000184 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
186 try
187 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189
190 if (context)
191 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500192 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000193 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500194 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000195 }
196
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000197 switch (target)
198 {
199 case GL_ARRAY_BUFFER:
200 context->bindArrayBuffer(buffer);
201 return;
202 case GL_ELEMENT_ARRAY_BUFFER:
203 context->bindElementArrayBuffer(buffer);
204 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000205 case GL_COPY_READ_BUFFER:
206 context->bindCopyReadBuffer(buffer);
207 return;
208 case GL_COPY_WRITE_BUFFER:
209 context->bindCopyWriteBuffer(buffer);
210 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000211 case GL_PIXEL_PACK_BUFFER:
212 context->bindPixelPackBuffer(buffer);
213 return;
214 case GL_PIXEL_UNPACK_BUFFER:
215 context->bindPixelUnpackBuffer(buffer);
216 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 case GL_UNIFORM_BUFFER:
218 context->bindGenericUniformBuffer(buffer);
219 return;
220 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000221 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000222 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000224 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225 }
226 }
227 }
228 catch(std::bad_alloc&)
229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231 }
232}
233
234void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000236 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237
238 try
239 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500240 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243 }
244
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246
247 if (context)
248 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000249 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindReadFramebuffer(framebuffer);
252 }
253
254 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
255 {
256 context->bindDrawFramebuffer(framebuffer);
257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259 }
260 catch(std::bad_alloc&)
261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263 }
264}
265
266void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000268 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000269
270 try
271 {
272 if (target != GL_RENDERBUFFER)
273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 }
276
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278
279 if (context)
280 {
281 context->bindRenderbuffer(renderbuffer);
282 }
283 }
284 catch(std::bad_alloc&)
285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000286 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 }
288}
289
290void __stdcall glBindTexture(GLenum target, GLuint texture)
291{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000292 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
294 try
295 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297
298 if (context)
299 {
300 gl::Texture *textureObject = context->getTexture(texture);
301
302 if (textureObject && textureObject->getTarget() != target && texture != 0)
303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000304 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305 }
306
307 switch (target)
308 {
309 case GL_TEXTURE_2D:
310 context->bindTexture2D(texture);
311 return;
312 case GL_TEXTURE_CUBE_MAP:
313 context->bindTextureCubeMap(texture);
314 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000315 case GL_TEXTURE_3D:
316 if (context->getClientVersion() < 3)
317 {
318 return gl::error(GL_INVALID_ENUM);
319 }
320 context->bindTexture3D(texture);
321 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000322 case GL_TEXTURE_2D_ARRAY:
323 if (context->getClientVersion() < 3)
324 {
325 return gl::error(GL_INVALID_ENUM);
326 }
327 context->bindTexture2DArray(texture);
328 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000329 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332 }
333 }
334 catch(std::bad_alloc&)
335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337 }
338}
339
340void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000342 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000343 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344
345 try
346 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000347 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348
349 if (context)
350 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000351 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353 }
354 catch(std::bad_alloc&)
355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357 }
358}
359
360void __stdcall glBlendEquation(GLenum mode)
361{
362 glBlendEquationSeparate(mode, mode);
363}
364
365void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000367 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368
369 try
370 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000371 gl::Context *context = gl::getNonLostContext();
372
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373 switch (modeRGB)
374 {
375 case GL_FUNC_ADD:
376 case GL_FUNC_SUBTRACT:
377 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000378 case GL_MIN:
379 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000380 break;
381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 }
385
386 switch (modeAlpha)
387 {
388 case GL_FUNC_ADD:
389 case GL_FUNC_SUBTRACT:
390 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000391 case GL_MIN:
392 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000393 break;
394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000396 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 if (context)
400 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000401 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
411{
412 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
413}
414
415void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000417 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000418 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419
420 try
421 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000422 gl::Context *context = gl::getNonLostContext();
423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 switch (srcRGB)
425 {
426 case GL_ZERO:
427 case GL_ONE:
428 case GL_SRC_COLOR:
429 case GL_ONE_MINUS_SRC_COLOR:
430 case GL_DST_COLOR:
431 case GL_ONE_MINUS_DST_COLOR:
432 case GL_SRC_ALPHA:
433 case GL_ONE_MINUS_SRC_ALPHA:
434 case GL_DST_ALPHA:
435 case GL_ONE_MINUS_DST_ALPHA:
436 case GL_CONSTANT_COLOR:
437 case GL_ONE_MINUS_CONSTANT_COLOR:
438 case GL_CONSTANT_ALPHA:
439 case GL_ONE_MINUS_CONSTANT_ALPHA:
440 case GL_SRC_ALPHA_SATURATE:
441 break;
442 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444 }
445
446 switch (dstRGB)
447 {
448 case GL_ZERO:
449 case GL_ONE:
450 case GL_SRC_COLOR:
451 case GL_ONE_MINUS_SRC_COLOR:
452 case GL_DST_COLOR:
453 case GL_ONE_MINUS_DST_COLOR:
454 case GL_SRC_ALPHA:
455 case GL_ONE_MINUS_SRC_ALPHA:
456 case GL_DST_ALPHA:
457 case GL_ONE_MINUS_DST_ALPHA:
458 case GL_CONSTANT_COLOR:
459 case GL_ONE_MINUS_CONSTANT_COLOR:
460 case GL_CONSTANT_ALPHA:
461 case GL_ONE_MINUS_CONSTANT_ALPHA:
462 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000463
464 case GL_SRC_ALPHA_SATURATE:
465 if (!context || context->getClientVersion() < 3)
466 {
467 return gl::error(GL_INVALID_ENUM);
468 }
469 break;
470
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000471 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473 }
474
475 switch (srcAlpha)
476 {
477 case GL_ZERO:
478 case GL_ONE:
479 case GL_SRC_COLOR:
480 case GL_ONE_MINUS_SRC_COLOR:
481 case GL_DST_COLOR:
482 case GL_ONE_MINUS_DST_COLOR:
483 case GL_SRC_ALPHA:
484 case GL_ONE_MINUS_SRC_ALPHA:
485 case GL_DST_ALPHA:
486 case GL_ONE_MINUS_DST_ALPHA:
487 case GL_CONSTANT_COLOR:
488 case GL_ONE_MINUS_CONSTANT_COLOR:
489 case GL_CONSTANT_ALPHA:
490 case GL_ONE_MINUS_CONSTANT_ALPHA:
491 case GL_SRC_ALPHA_SATURATE:
492 break;
493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000494 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000495 }
496
497 switch (dstAlpha)
498 {
499 case GL_ZERO:
500 case GL_ONE:
501 case GL_SRC_COLOR:
502 case GL_ONE_MINUS_SRC_COLOR:
503 case GL_DST_COLOR:
504 case GL_ONE_MINUS_DST_COLOR:
505 case GL_SRC_ALPHA:
506 case GL_ONE_MINUS_SRC_ALPHA:
507 case GL_DST_ALPHA:
508 case GL_ONE_MINUS_DST_ALPHA:
509 case GL_CONSTANT_COLOR:
510 case GL_ONE_MINUS_CONSTANT_COLOR:
511 case GL_CONSTANT_ALPHA:
512 case GL_ONE_MINUS_CONSTANT_ALPHA:
513 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000514
515 case GL_SRC_ALPHA_SATURATE:
516 if (!context || context->getClientVersion() < 3)
517 {
518 return gl::error(GL_INVALID_ENUM);
519 }
520 break;
521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000524 }
525
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000526 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
527 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
528
529 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
530 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
531
532 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000534 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000535 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 if (context)
539 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000540 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542 }
543 catch(std::bad_alloc&)
544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546 }
547}
548
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000549void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000551 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000552 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000553
554 try
555 {
556 if (size < 0)
557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559 }
560
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000561 gl::Context *context = gl::getNonLostContext();
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 switch (usage)
564 {
565 case GL_STREAM_DRAW:
566 case GL_STATIC_DRAW:
567 case GL_DYNAMIC_DRAW:
568 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000569
570 case GL_STREAM_READ:
571 case GL_STREAM_COPY:
572 case GL_STATIC_READ:
573 case GL_STATIC_COPY:
574 case GL_DYNAMIC_READ:
575 case GL_DYNAMIC_COPY:
576 if (context && context->getClientVersion() < 3)
577 {
578 return gl::error(GL_INVALID_ENUM);
579 }
580 break;
581
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 }
585
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 if (context)
587 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000590 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591 }
592
Jamie Madill8c96d582014-03-05 15:01:23 -0500593 gl::Buffer *buffer = context->getTargetBuffer(target);
594
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 if (!buffer)
596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000597 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000600 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602 }
603 catch(std::bad_alloc&)
604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000605 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606 }
607}
608
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000609void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000611 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000612 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613
614 try
615 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000616 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619 }
620
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000621 if (data == NULL)
622 {
623 return;
624 }
625
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000627
628 if (context)
629 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000632 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000633 }
634
Jamie Madill8c96d582014-03-05 15:01:23 -0500635 gl::Buffer *buffer = context->getTargetBuffer(target);
636
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 if (!buffer)
638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000640 }
641
Jamie Madill7a5f7382014-03-05 15:01:24 -0500642 if (buffer->mapped())
643 {
644 return gl::error(GL_INVALID_OPERATION);
645 }
646
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000647 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000650 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000651
652 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 }
655 catch(std::bad_alloc&)
656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 }
659}
660
661GLenum __stdcall glCheckFramebufferStatus(GLenum target)
662{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000663 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664
665 try
666 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500667 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000669 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 }
671
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000672 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673
674 if (context)
675 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500676 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
677 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 return framebuffer->completeness();
679 }
680 }
681 catch(std::bad_alloc&)
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
686 return 0;
687}
688
689void __stdcall glClear(GLbitfield mask)
690{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000691 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692
693 try
694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696
697 if (context)
698 {
Geoff Lang0b833232013-08-21 10:13:29 -0400699 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
700
701 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
702 {
703 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
704 }
705
706 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
707 {
708 return gl::error(GL_INVALID_VALUE);
709 }
710
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000711 context->clear(mask);
712 }
713 }
714 catch(std::bad_alloc&)
715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 }
718}
719
720void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000722 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000723 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 try
726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728
729 if (context)
730 {
731 context->setClearColor(red, green, blue, alpha);
732 }
733 }
734 catch(std::bad_alloc&)
735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737 }
738}
739
740void __stdcall glClearDepthf(GLclampf depth)
741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000742 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743
744 try
745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000747
748 if (context)
749 {
750 context->setClearDepth(depth);
751 }
752 }
753 catch(std::bad_alloc&)
754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000756 }
757}
758
759void __stdcall glClearStencil(GLint s)
760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000761 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762
763 try
764 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000766
767 if (context)
768 {
769 context->setClearStencil(s);
770 }
771 }
772 catch(std::bad_alloc&)
773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776}
777
778void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
779{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000780 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000781 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 try
784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786
787 if (context)
788 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000789 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790 }
791 }
792 catch(std::bad_alloc&)
793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796}
797
798void __stdcall glCompileShader(GLuint shader)
799{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000800 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 try
803 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000805
806 if (context)
807 {
808 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000809
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810 if (!shaderObject)
811 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000812 if (context->getProgram(shader))
813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000814 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000815 }
816 else
817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000819 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820 }
821
822 shaderObject->compile();
823 }
824 }
825 catch(std::bad_alloc&)
826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 }
829}
830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000831void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
832 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000834 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000835 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 target, level, internalformat, width, height, border, imageSize, data);
837
838 try
839 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000841
842 if (context)
843 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000844 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400845 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000846 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
847 {
848 return;
849 }
850
851 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400852 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400853 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000854 {
855 return;
856 }
857
858 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000861 }
862
863 switch (target)
864 {
865 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000866 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000867 gl::Texture2D *texture = context->getTexture2D();
868 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000869 }
870 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000871
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
873 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
874 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
875 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
877 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000878 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000879 gl::TextureCubeMap *texture = context->getTextureCubeMap();
880 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000881 }
882 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000883
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000885 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000886 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000887 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000888 }
889 catch(std::bad_alloc&)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 }
893}
894
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000895void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
896 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000898 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000899 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000900 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 target, level, xoffset, yoffset, width, height, format, imageSize, data);
902
903 try
904 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000905 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000906
907 if (context)
908 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000909 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400910 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000911 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
912 {
913 return;
914 }
915
916 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400917 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400918 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000919 {
920 return;
921 }
922
923 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000926 }
927
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000928 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000929 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000930 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000931 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000932 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000933 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000934 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000935 break;
936
937 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
938 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
939 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
940 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
942 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000943 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000945 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000946 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000947 break;
948
949 default:
950 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000951 }
952 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 }
954 catch(std::bad_alloc&)
955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
958}
959
960void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000962 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000963 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 target, level, internalformat, x, y, width, height, border);
965
966 try
967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000969
970 if (context)
971 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000972 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400973 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000974 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000975 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000976 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000977 }
978
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400980 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000981 0, 0, 0, x, y, width, height, border))
982 {
983 return;
984 }
985
986 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
987
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000988 switch (target)
989 {
990 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000992 gl::Texture2D *texture = context->getTexture2D();
993 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 }
995 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
998 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1005 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 }
1007 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001008
1009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001011 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001013 }
1014 catch(std::bad_alloc&)
1015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018}
1019
1020void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001024 target, level, xoffset, yoffset, x, y, width, height);
1025
1026 try
1027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001029
1030 if (context)
1031 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001032 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001033 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001034 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001035 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001036 return;
1037 }
1038
1039 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001040 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001041 xoffset, yoffset, 0, x, y, width, height, 0))
1042 {
1043 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001044 }
1045
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001046 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001047
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001048 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001049 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001050 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001051 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 gl::Texture2D *texture = context->getTexture2D();
1053 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001054 }
1055 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056
1057 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1058 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1060 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001063 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1065 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001066 }
1067 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001069 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001071 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001074
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001075 catch(std::bad_alloc&)
1076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001078 }
1079}
1080
1081GLuint __stdcall glCreateProgram(void)
1082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001083 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084
1085 try
1086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088
1089 if (context)
1090 {
1091 return context->createProgram();
1092 }
1093 }
1094 catch(std::bad_alloc&)
1095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001096 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001097 }
1098
1099 return 0;
1100}
1101
1102GLuint __stdcall glCreateShader(GLenum type)
1103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001104 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001105
1106 try
1107 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109
1110 if (context)
1111 {
1112 switch (type)
1113 {
1114 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001115 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001116 return context->createShader(type);
1117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 }
1120 }
1121 }
1122 catch(std::bad_alloc&)
1123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126
1127 return 0;
1128}
1129
1130void __stdcall glCullFace(GLenum mode)
1131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001132 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001133
1134 try
1135 {
1136 switch (mode)
1137 {
1138 case GL_FRONT:
1139 case GL_BACK:
1140 case GL_FRONT_AND_BACK:
1141 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001143
1144 if (context)
1145 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001146 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001147 }
1148 }
1149 break;
1150 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001151 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001152 }
1153 }
1154 catch(std::bad_alloc&)
1155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 }
1158}
1159
1160void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001162 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163
1164 try
1165 {
1166 if (n < 0)
1167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169 }
1170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172
1173 if (context)
1174 {
1175 for (int i = 0; i < n; i++)
1176 {
1177 context->deleteBuffer(buffers[i]);
1178 }
1179 }
1180 }
1181 catch(std::bad_alloc&)
1182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184 }
1185}
1186
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001187void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001189 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001190
1191 try
1192 {
1193 if (n < 0)
1194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001195 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001196 }
1197
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001198 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001199
1200 if (context)
1201 {
1202 for (int i = 0; i < n; i++)
1203 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001204 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001205 }
1206 }
1207 }
1208 catch(std::bad_alloc&)
1209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001211 }
1212}
1213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001216 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217
1218 try
1219 {
1220 if (n < 0)
1221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001223 }
1224
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226
1227 if (context)
1228 {
1229 for (int i = 0; i < n; i++)
1230 {
1231 if (framebuffers[i] != 0)
1232 {
1233 context->deleteFramebuffer(framebuffers[i]);
1234 }
1235 }
1236 }
1237 }
1238 catch(std::bad_alloc&)
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 }
1242}
1243
1244void __stdcall glDeleteProgram(GLuint program)
1245{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001246 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247
1248 try
1249 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001250 if (program == 0)
1251 {
1252 return;
1253 }
1254
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256
1257 if (context)
1258 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001259 if (!context->getProgram(program))
1260 {
1261 if(context->getShader(program))
1262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001264 }
1265 else
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001268 }
1269 }
1270
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 context->deleteProgram(program);
1272 }
1273 }
1274 catch(std::bad_alloc&)
1275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 }
1278}
1279
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001280void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1281{
1282 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1283
1284 try
1285 {
1286 if (n < 0)
1287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001289 }
1290
1291 gl::Context *context = gl::getNonLostContext();
1292
1293 if (context)
1294 {
1295 for (int i = 0; i < n; i++)
1296 {
1297 context->deleteQuery(ids[i]);
1298 }
1299 }
1300 }
1301 catch(std::bad_alloc&)
1302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001304 }
1305}
1306
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1308{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001309 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310
1311 try
1312 {
1313 if (n < 0)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001316 }
1317
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001318 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319
1320 if (context)
1321 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001322 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 {
1324 context->deleteRenderbuffer(renderbuffers[i]);
1325 }
1326 }
1327 }
1328 catch(std::bad_alloc&)
1329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331 }
1332}
1333
1334void __stdcall glDeleteShader(GLuint shader)
1335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001336 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337
1338 try
1339 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001340 if (shader == 0)
1341 {
1342 return;
1343 }
1344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346
1347 if (context)
1348 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001349 if (!context->getShader(shader))
1350 {
1351 if(context->getProgram(shader))
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001354 }
1355 else
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001358 }
1359 }
1360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001361 context->deleteShader(shader);
1362 }
1363 }
1364 catch(std::bad_alloc&)
1365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 }
1368}
1369
1370void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001372 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 try
1375 {
1376 if (n < 0)
1377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001379 }
1380
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382
1383 if (context)
1384 {
1385 for (int i = 0; i < n; i++)
1386 {
1387 if (textures[i] != 0)
1388 {
1389 context->deleteTexture(textures[i]);
1390 }
1391 }
1392 }
1393 }
1394 catch(std::bad_alloc&)
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001397 }
1398}
1399
1400void __stdcall glDepthFunc(GLenum func)
1401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001402 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001403
1404 try
1405 {
1406 switch (func)
1407 {
1408 case GL_NEVER:
1409 case GL_ALWAYS:
1410 case GL_LESS:
1411 case GL_LEQUAL:
1412 case GL_EQUAL:
1413 case GL_GREATER:
1414 case GL_GEQUAL:
1415 case GL_NOTEQUAL:
1416 break;
1417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419 }
1420
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422
1423 if (context)
1424 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001425 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001426 }
1427 }
1428 catch(std::bad_alloc&)
1429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431 }
1432}
1433
1434void __stdcall glDepthMask(GLboolean flag)
1435{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001436 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437
1438 try
1439 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441
1442 if (context)
1443 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001444 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446 }
1447 catch(std::bad_alloc&)
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450 }
1451}
1452
1453void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001455 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001463 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465 }
1466 catch(std::bad_alloc&)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 }
1470}
1471
1472void __stdcall glDetachShader(GLuint program, GLuint shader)
1473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001474 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 try
1477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479
1480 if (context)
1481 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001482
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483 gl::Program *programObject = context->getProgram(program);
1484 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001485
1486 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001487 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488 gl::Shader *shaderByProgramHandle;
1489 shaderByProgramHandle = context->getShader(program);
1490 if (!shaderByProgramHandle)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001493 }
1494 else
1495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001497 }
1498 }
1499
1500 if (!shaderObject)
1501 {
1502 gl::Program *programByShaderHandle = context->getProgram(shader);
1503 if (!programByShaderHandle)
1504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001506 }
1507 else
1508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001510 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001511 }
1512
1513 if (!programObject->detachShader(shaderObject))
1514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
1518 }
1519 catch(std::bad_alloc&)
1520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
1523}
1524
1525void __stdcall glDisable(GLenum cap)
1526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001527 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528
1529 try
1530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001532
1533 if (context)
1534 {
Geoff Lang0550d032014-01-30 11:29:07 -05001535 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538 }
Geoff Lang0550d032014-01-30 11:29:07 -05001539
1540 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
1542 }
1543 catch(std::bad_alloc&)
1544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546 }
1547}
1548
1549void __stdcall glDisableVertexAttribArray(GLuint index)
1550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001551 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552
1553 try
1554 {
1555 if (index >= gl::MAX_VERTEX_ATTRIBS)
1556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558 }
1559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
1562 if (context)
1563 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001564 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565 }
1566 }
1567 catch(std::bad_alloc&)
1568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571}
1572
1573void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001575 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576
1577 try
1578 {
1579 if (count < 0 || first < 0)
1580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582 }
1583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
Jamie Madill7a5f7382014-03-05 15:01:24 -05001586 // Check for mapped buffers
1587 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1588 {
1589 return gl::error(GL_INVALID_OPERATION);
1590 }
1591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592 if (context)
1593 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001594 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1595 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1596 curTransformFeedback->getDrawMode() != mode)
1597 {
1598 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1599 // that does not match the current transform feedback object's draw mode (if transform feedback
1600 // is active), (3.0.2, section 2.14, pg 86)
1601 return gl::error(GL_INVALID_OPERATION);
1602 }
1603
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001604 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605 }
1606 }
1607 catch(std::bad_alloc&)
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001610 }
1611}
1612
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001613void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1614{
1615 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1616
1617 try
1618 {
1619 if (count < 0 || first < 0 || primcount < 0)
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001622 }
1623
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001624 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001625 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001626 gl::Context *context = gl::getNonLostContext();
1627
Jamie Madill7a5f7382014-03-05 15:01:24 -05001628 // Check for mapped buffers
1629 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1630 {
1631 return gl::error(GL_INVALID_OPERATION);
1632 }
1633
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001634 if (context)
1635 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001636 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1637 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1638 curTransformFeedback->getDrawMode() != mode)
1639 {
1640 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1641 // that does not match the current transform feedback object's draw mode (if transform feedback
1642 // is active), (3.0.2, section 2.14, pg 86)
1643 return gl::error(GL_INVALID_OPERATION);
1644 }
1645
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001646 context->drawArrays(mode, first, count, primcount);
1647 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001648 }
1649 }
1650 catch(std::bad_alloc&)
1651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001653 }
1654}
1655
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001656void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001658 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001659 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660
1661 try
1662 {
1663 if (count < 0)
1664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666 }
1667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 if (context)
1671 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001672 switch (type)
1673 {
1674 case GL_UNSIGNED_BYTE:
1675 case GL_UNSIGNED_SHORT:
1676 break;
1677 case GL_UNSIGNED_INT:
1678 if (!context->supports32bitIndices())
1679 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001680 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001681 }
1682 break;
1683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001685 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001686
1687 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1688 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1689 {
1690 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1691 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1692 return gl::error(GL_INVALID_OPERATION);
1693 }
1694
Jamie Madill7a5f7382014-03-05 15:01:24 -05001695 // Check for mapped buffers
1696 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1697 {
1698 return gl::error(GL_INVALID_OPERATION);
1699 }
1700
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001701 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702 }
1703 }
1704 catch(std::bad_alloc&)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708}
1709
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001710void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1711{
1712 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1713 mode, count, type, indices, primcount);
1714
1715 try
1716 {
1717 if (count < 0 || primcount < 0)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001720 }
1721
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001722 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001723 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001724 gl::Context *context = gl::getNonLostContext();
1725
1726 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001727 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001728 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 case GL_UNSIGNED_BYTE:
1731 case GL_UNSIGNED_SHORT:
1732 break;
1733 case GL_UNSIGNED_INT:
1734 if (!context->supports32bitIndices())
1735 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001737 }
1738 break;
1739 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001741 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001742
1743 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1744 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1745 {
1746 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1747 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1748 return gl::error(GL_INVALID_OPERATION);
1749 }
1750
Jamie Madill7a5f7382014-03-05 15:01:24 -05001751 // Check for mapped buffers
1752 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1753 {
1754 return gl::error(GL_INVALID_OPERATION);
1755 }
1756
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001757 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001758 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
1760 }
1761 catch(std::bad_alloc&)
1762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764 }
1765}
1766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767void __stdcall glEnable(GLenum cap)
1768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001769 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774
1775 if (context)
1776 {
Geoff Lang0550d032014-01-30 11:29:07 -05001777 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780 }
Geoff Lang0550d032014-01-30 11:29:07 -05001781
1782 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783 }
1784 }
1785 catch(std::bad_alloc&)
1786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789}
1790
1791void __stdcall glEnableVertexAttribArray(GLuint index)
1792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001793 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794
1795 try
1796 {
1797 if (index >= gl::MAX_VERTEX_ATTRIBS)
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800 }
1801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 if (context)
1805 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001806 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 }
1808 }
1809 catch(std::bad_alloc&)
1810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813}
1814
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001815void __stdcall glEndQueryEXT(GLenum target)
1816{
1817 EVENT("GLenum target = 0x%X)", target);
1818
1819 try
1820 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001821 gl::Context *context = gl::getNonLostContext();
1822
1823 if (context)
1824 {
Geoff Lang37dde692014-01-31 16:34:54 -05001825 if (!ValidQueryType(context, target))
1826 {
1827 return gl::error(GL_INVALID_ENUM);
1828 }
1829
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001830 context->endQuery(target);
1831 }
1832 }
1833 catch(std::bad_alloc&)
1834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001836 }
1837}
1838
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001839void __stdcall glFinishFenceNV(GLuint fence)
1840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001841 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001842
1843 try
1844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001845 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001846
1847 if (context)
1848 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001849 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001850
1851 if (fenceObject == NULL)
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001854 }
1855
Jamie Madillfb9a7402013-07-26 11:55:01 -04001856 if (fenceObject->isFence() != GL_TRUE)
1857 {
1858 return gl::error(GL_INVALID_OPERATION);
1859 }
1860
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001861 fenceObject->finishFence();
1862 }
1863 }
1864 catch(std::bad_alloc&)
1865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001867 }
1868}
1869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870void __stdcall glFinish(void)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877
1878 if (context)
1879 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001880 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001881 }
1882 }
1883 catch(std::bad_alloc&)
1884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001885 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886 }
1887}
1888
1889void __stdcall glFlush(void)
1890{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001891 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892
1893 try
1894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
1897 if (context)
1898 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001899 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 }
1901 }
1902 catch(std::bad_alloc&)
1903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905 }
1906}
1907
1908void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001910 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001911 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912
1913 try
1914 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001915 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
1919
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 if (context)
1923 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001924 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001925 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001926 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001928
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001929 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1930 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001932 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001934 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001935 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001936 }
1937 else
1938 {
1939 switch (attachment)
1940 {
1941 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001942 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001943 break;
1944 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001945 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001946 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001947 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1949 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001950 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001951 UNREACHABLE();
1952 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955 }
1956 }
1957 catch(std::bad_alloc&)
1958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961}
1962
1963void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001965 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001966 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 try
1969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 if (context)
1972 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001974 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001975 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001976 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001977 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001978
1979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001980 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001981 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001982 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001983 }
1984
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001985 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001987 textarget = GL_NONE;
1988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001990 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001992 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001993 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001994 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001995 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001996 }
1997 else
1998 {
1999 switch (attachment)
2000 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002001 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2002 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2003 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002004 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007 }
2008 catch(std::bad_alloc&)
2009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002010 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 }
2012}
2013
2014void __stdcall glFrontFace(GLenum mode)
2015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002016 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017
2018 try
2019 {
2020 switch (mode)
2021 {
2022 case GL_CW:
2023 case GL_CCW:
2024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026
2027 if (context)
2028 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002029 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030 }
2031 }
2032 break;
2033 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002034 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036 }
2037 catch(std::bad_alloc&)
2038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041}
2042
2043void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002045 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046
2047 try
2048 {
2049 if (n < 0)
2050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 }
2053
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002054 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055
2056 if (context)
2057 {
2058 for (int i = 0; i < n; i++)
2059 {
2060 buffers[i] = context->createBuffer();
2061 }
2062 }
2063 }
2064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070void __stdcall glGenerateMipmap(GLenum target)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073
2074 try
2075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002077
2078 if (context)
2079 {
Jamie Madill35d15012013-10-07 10:46:37 -04002080 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002082 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002083 }
Geoff Langae4852a2013-06-05 15:00:34 -04002084
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002085 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002086
2087 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002088 {
2089 return gl::error(GL_INVALID_OPERATION);
2090 }
2091
Geoff Lang005df412013-10-16 14:12:50 -04002092 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002093
Geoff Langae4852a2013-06-05 15:00:34 -04002094 // Internally, all texture formats are sized so checking if the format
2095 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002096
2097 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2098 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2099
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002100 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2101 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002102 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2103 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002104 {
2105 return gl::error(GL_INVALID_OPERATION);
2106 }
2107
Jamie Madillc1f8b162013-10-07 10:46:38 -04002108 // Non-power of 2 ES2 check
2109 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2110 {
2111 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2112 return gl::error(GL_INVALID_OPERATION);
2113 }
2114
2115 // Cube completeness check
2116 if (target == GL_TEXTURE_CUBE_MAP)
2117 {
2118 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2119 if (!textureCube->isCubeComplete())
2120 {
2121 return gl::error(GL_INVALID_OPERATION);
2122 }
2123 }
2124
Geoff Langae4852a2013-06-05 15:00:34 -04002125 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002126 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127 }
2128 catch(std::bad_alloc&)
2129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002131 }
2132}
2133
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002134void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002136 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002137
2138 try
2139 {
2140 if (n < 0)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002143 }
2144
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002145 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002146
2147 if (context)
2148 {
2149 for (int i = 0; i < n; i++)
2150 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002151 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002152 }
2153 }
2154 }
2155 catch(std::bad_alloc&)
2156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002158 }
2159}
2160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002163 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164
2165 try
2166 {
2167 if (n < 0)
2168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173
2174 if (context)
2175 {
2176 for (int i = 0; i < n; i++)
2177 {
2178 framebuffers[i] = context->createFramebuffer();
2179 }
2180 }
2181 }
2182 catch(std::bad_alloc&)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002188void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2189{
2190 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2191
2192 try
2193 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002194 gl::Context *context = gl::getNonLostContext();
2195
2196 if (context)
2197 {
Geoff Lang37dde692014-01-31 16:34:54 -05002198 if (n < 0)
2199 {
2200 return gl::error(GL_INVALID_VALUE);
2201 }
2202
2203 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002204 {
2205 ids[i] = context->createQuery();
2206 }
2207 }
2208 }
2209 catch(std::bad_alloc&)
2210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002212 }
2213}
2214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002217 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218
2219 try
2220 {
2221 if (n < 0)
2222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002224 }
2225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227
2228 if (context)
2229 {
2230 for (int i = 0; i < n; i++)
2231 {
2232 renderbuffers[i] = context->createRenderbuffer();
2233 }
2234 }
2235 }
2236 catch(std::bad_alloc&)
2237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239 }
2240}
2241
2242void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2243{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002244 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 try
2247 {
2248 if (n < 0)
2249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251 }
2252
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002253 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254
2255 if (context)
2256 {
2257 for (int i = 0; i < n; i++)
2258 {
2259 textures[i] = context->createTexture();
2260 }
2261 }
2262 }
2263 catch(std::bad_alloc&)
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267}
2268
daniel@transgaming.com85423182010-04-22 13:35:27 +00002269void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002271 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002272 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002273 program, index, bufsize, length, size, type, name);
2274
2275 try
2276 {
2277 if (bufsize < 0)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002283
2284 if (context)
2285 {
2286 gl::Program *programObject = context->getProgram(program);
2287
2288 if (!programObject)
2289 {
2290 if (context->getShader(program))
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002293 }
2294 else
2295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002297 }
2298 }
2299
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002300 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002303 }
2304
2305 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2306 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307 }
2308 catch(std::bad_alloc&)
2309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 }
2312}
2313
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002314void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002316 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002317 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318 program, index, bufsize, length, size, type, name);
2319
2320 try
2321 {
2322 if (bufsize < 0)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002328
2329 if (context)
2330 {
2331 gl::Program *programObject = context->getProgram(program);
2332
2333 if (!programObject)
2334 {
2335 if (context->getShader(program))
2336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002338 }
2339 else
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002342 }
2343 }
2344
2345 if (index >= (GLuint)programObject->getActiveUniformCount())
2346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002348 }
2349
2350 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2351 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002362 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (maxcount < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002372
2373 if (context)
2374 {
2375 gl::Program *programObject = context->getProgram(program);
2376
2377 if (!programObject)
2378 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002379 if (context->getShader(program))
2380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002382 }
2383 else
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002386 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002387 }
2388
2389 return programObject->getAttachedShaders(maxcount, count, shaders);
2390 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392 catch(std::bad_alloc&)
2393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002394 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395 }
2396}
2397
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002398int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002400 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401
2402 try
2403 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405
2406 if (context)
2407 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409 gl::Program *programObject = context->getProgram(program);
2410
2411 if (!programObject)
2412 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002413 if (context->getShader(program))
2414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002415 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002416 }
2417 else
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421 }
2422
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002423 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002424 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002426 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002427 }
2428
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002429 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
2431 }
2432 catch(std::bad_alloc&)
2433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002434 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 }
2436
2437 return -1;
2438}
2439
2440void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002442 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443
2444 try
2445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002447
2448 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002450 GLenum nativeType;
2451 unsigned int numParams = 0;
2452 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2453 return gl::error(GL_INVALID_ENUM);
2454
2455 // pname is valid, but there are no parameters to return
2456 if (numParams == 0)
2457 return;
2458
2459 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002460 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002461 context->getBooleanv(pname, params);
2462 }
Jamie Madill55856b12014-01-02 13:59:50 -05002463 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002464 {
Jamie Madill55856b12014-01-02 13:59:50 -05002465 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468 }
2469 catch(std::bad_alloc&)
2470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 }
2473}
2474
2475void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002477 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478
2479 try
2480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002482
2483 if (context)
2484 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002485 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002486 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002487 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002488 }
2489
Jamie Madill70656a62014-03-05 15:01:26 -05002490 if (!gl::ValidBufferParameter(context, pname))
2491 {
2492 return gl::error(GL_INVALID_ENUM);
2493 }
2494
Jamie Madill8c96d582014-03-05 15:01:23 -05002495 gl::Buffer *buffer = context->getTargetBuffer(target);
2496
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002497 if (!buffer)
2498 {
2499 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002501 }
2502
2503 switch (pname)
2504 {
2505 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002506 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002507 break;
2508 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002509 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002510 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002511 case GL_BUFFER_ACCESS_FLAGS:
2512 *params = buffer->accessFlags();
2513 break;
2514 case GL_BUFFER_MAPPED:
2515 *params = static_cast<GLint>(buffer->mapped());
2516 break;
2517 case GL_BUFFER_MAP_OFFSET:
2518 *params = gl::clampCast<GLint>(buffer->mapOffset());
2519 break;
2520 case GL_BUFFER_MAP_LENGTH:
2521 *params = gl::clampCast<GLint>(buffer->mapLength());
2522 break;
2523 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002524 }
2525 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527 catch(std::bad_alloc&)
2528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002530 }
2531}
2532
2533GLenum __stdcall glGetError(void)
2534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002535 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536
2537 gl::Context *context = gl::getContext();
2538
2539 if (context)
2540 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002541 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542 }
2543
2544 return GL_NO_ERROR;
2545}
2546
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002547void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002549 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002550
2551 try
2552 {
2553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002554 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002555
2556 if (context)
2557 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002558 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002559
2560 if (fenceObject == NULL)
2561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002562 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002563 }
2564
Jamie Madillfb9a7402013-07-26 11:55:01 -04002565 if (fenceObject->isFence() != GL_TRUE)
2566 {
2567 return gl::error(GL_INVALID_OPERATION);
2568 }
2569
2570 switch (pname)
2571 {
2572 case GL_FENCE_STATUS_NV:
2573 case GL_FENCE_CONDITION_NV:
2574 break;
2575
2576 default: return gl::error(GL_INVALID_ENUM);
2577 }
2578
2579 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002580 }
2581 }
2582 catch(std::bad_alloc&)
2583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002584 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002585 }
2586}
2587
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002590 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591
2592 try
2593 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002595
2596 if (context)
2597 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002598 GLenum nativeType;
2599 unsigned int numParams = 0;
2600 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2601 return gl::error(GL_INVALID_ENUM);
2602
2603 // pname is valid, but that there are no parameters to return.
2604 if (numParams == 0)
2605 return;
2606
2607 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002608 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002609 context->getFloatv(pname, params);
2610 }
Jamie Madill55856b12014-01-02 13:59:50 -05002611 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002612 {
Jamie Madill55856b12014-01-02 13:59:50 -05002613 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002614 }
2615 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002616 }
2617 catch(std::bad_alloc&)
2618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620 }
2621}
2622
2623void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002625 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002626 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627
2628 try
2629 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631
2632 if (context)
2633 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002634 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002636 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002637 }
2638
Geoff Lang646559f2013-08-15 11:08:15 -04002639 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002640 {
Geoff Lang646559f2013-08-15 11:08:15 -04002641 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2642 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2643 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2644 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2645 break;
2646 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2647 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2651 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2652 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2653 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2654 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2655 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002656 {
Geoff Lang646559f2013-08-15 11:08:15 -04002657 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002658 }
Geoff Lang646559f2013-08-15 11:08:15 -04002659 default:
2660 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002661 }
Geoff Lang646559f2013-08-15 11:08:15 -04002662
2663 // Determine if the attachment is a valid enum
2664 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002665 {
Geoff Lang646559f2013-08-15 11:08:15 -04002666 case GL_BACK:
2667 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002668 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002669 case GL_STENCIL:
2670 case GL_DEPTH_STENCIL_ATTACHMENT:
2671 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002672 {
Geoff Lang646559f2013-08-15 11:08:15 -04002673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002674 }
Geoff Lang646559f2013-08-15 11:08:15 -04002675 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002676
Geoff Lang646559f2013-08-15 11:08:15 -04002677 case GL_DEPTH_ATTACHMENT:
2678 case GL_STENCIL_ATTACHMENT:
2679 break;
2680
2681 default:
2682 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2683 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2684 {
2685 return gl::error(GL_INVALID_ENUM);
2686 }
2687 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002688 }
2689
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002690 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2691 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002692 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2693
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002694 GLenum attachmentType;
2695 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002696 GLuint attachmentLevel;
2697 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002698 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002699
Geoff Lang646559f2013-08-15 11:08:15 -04002700 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701 {
Geoff Lang646559f2013-08-15 11:08:15 -04002702 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002703 {
Geoff Lang646559f2013-08-15 11:08:15 -04002704 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002705 }
2706
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002707 switch (attachment)
2708 {
Geoff Lang646559f2013-08-15 11:08:15 -04002709 case GL_BACK:
2710 attachmentType = framebuffer->getColorbufferType(0);
2711 attachmentHandle = framebuffer->getColorbufferHandle(0);
2712 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2713 attachmentLayer = framebuffer->getColorbufferLayer(0);
2714 renderbuffer = framebuffer->getColorbuffer(0);
2715 break;
2716 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002717 attachmentType = framebuffer->getDepthbufferType();
2718 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002719 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2720 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002721 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002722 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002723 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002724 attachmentType = framebuffer->getStencilbufferType();
2725 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002726 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2727 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002728 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002729 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002730 default:
2731 return gl::error(GL_INVALID_OPERATION);
2732 }
2733 }
2734 else
2735 {
2736 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2737 {
2738 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2739 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2740 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2741 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2742 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2743 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2744 }
2745 else
2746 {
2747 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002748 {
Geoff Lang646559f2013-08-15 11:08:15 -04002749 case GL_DEPTH_ATTACHMENT:
2750 attachmentType = framebuffer->getDepthbufferType();
2751 attachmentHandle = framebuffer->getDepthbufferHandle();
2752 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2753 attachmentLayer = framebuffer->getDepthbufferLayer();
2754 renderbuffer = framebuffer->getDepthbuffer();
2755 break;
2756 case GL_STENCIL_ATTACHMENT:
2757 attachmentType = framebuffer->getStencilbufferType();
2758 attachmentHandle = framebuffer->getStencilbufferHandle();
2759 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2760 attachmentLayer = framebuffer->getStencilbufferLayer();
2761 renderbuffer = framebuffer->getStencilbuffer();
2762 break;
2763 case GL_DEPTH_STENCIL_ATTACHMENT:
2764 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2765 {
2766 return gl::error(GL_INVALID_OPERATION);
2767 }
2768 attachmentType = framebuffer->getDepthStencilbufferType();
2769 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2770 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2771 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2772 renderbuffer = framebuffer->getDepthStencilBuffer();
2773 break;
2774 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002775 return gl::error(GL_INVALID_OPERATION);
2776 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002777 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002778 }
2779
2780 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002781 if (framebufferHandle == 0)
2782 {
2783 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2784 }
2785 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002786 {
2787 attachmentObjectType = attachmentType;
2788 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002789 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002790 {
2791 attachmentObjectType = GL_TEXTURE;
2792 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002793 else
2794 {
2795 UNREACHABLE();
2796 return;
2797 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002798
Geoff Lang646559f2013-08-15 11:08:15 -04002799 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002800 {
Geoff Lang646559f2013-08-15 11:08:15 -04002801 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2802 // is NONE, then querying any other pname will generate INVALID_ENUM.
2803
2804 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2805 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2806 // INVALID_OPERATION for all other pnames
2807
2808 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002809 {
Geoff Lang646559f2013-08-15 11:08:15 -04002810 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2811 *params = attachmentObjectType;
2812 break;
2813
2814 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2815 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002816 {
Geoff Lang646559f2013-08-15 11:08:15 -04002817 return gl::error(GL_INVALID_ENUM);
2818 }
2819 *params = 0;
2820 break;
2821
2822 default:
2823 if (context->getClientVersion() < 3)
2824 {
2825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002826 }
2827 else
2828 {
Geoff Lang646559f2013-08-15 11:08:15 -04002829 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002830 }
2831 }
Geoff Lang646559f2013-08-15 11:08:15 -04002832 }
2833 else
2834 {
2835 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2836 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2837 ASSERT(renderbuffer != NULL);
2838
2839 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002840 {
Geoff Lang646559f2013-08-15 11:08:15 -04002841 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2842 *params = attachmentObjectType;
2843 break;
2844
2845 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2846 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2847 {
2848 return gl::error(GL_INVALID_ENUM);
2849 }
2850 *params = attachmentHandle;
2851 break;
2852
2853 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2854 if (attachmentObjectType != GL_TEXTURE)
2855 {
2856 return gl::error(GL_INVALID_ENUM);
2857 }
2858 *params = attachmentLevel;
2859 break;
2860
2861 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2862 if (attachmentObjectType != GL_TEXTURE)
2863 {
2864 return gl::error(GL_INVALID_ENUM);
2865 }
2866 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2867 break;
2868
2869 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2870 *params = renderbuffer->getRedSize();
2871 break;
2872
2873 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2874 *params = renderbuffer->getGreenSize();
2875 break;
2876
2877 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2878 *params = renderbuffer->getBlueSize();
2879 break;
2880
2881 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2882 *params = renderbuffer->getAlphaSize();
2883 break;
2884
2885 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2886 *params = renderbuffer->getDepthSize();
2887 break;
2888
2889 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2890 *params = renderbuffer->getStencilSize();
2891 break;
2892
2893 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2894 if (attachment == GL_DEPTH_STENCIL)
2895 {
2896 gl::error(GL_INVALID_OPERATION);
2897 }
2898 *params = renderbuffer->getComponentType();
2899 break;
2900
2901 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2902 *params = renderbuffer->getColorEncoding();
2903 break;
2904
2905 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2906 if (attachmentObjectType != GL_TEXTURE)
2907 {
2908 return gl::error(GL_INVALID_ENUM);
2909 }
2910 *params = attachmentLayer;
2911 break;
2912
2913 default:
2914 UNREACHABLE();
2915 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002916 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919 }
2920 catch(std::bad_alloc&)
2921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002922 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002923 }
2924}
2925
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002926GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2927{
2928 EVENT("()");
2929
2930 try
2931 {
2932 gl::Context *context = gl::getContext();
2933
2934 if (context)
2935 {
2936 return context->getResetStatus();
2937 }
2938
2939 return GL_NO_ERROR;
2940 }
2941 catch(std::bad_alloc&)
2942 {
2943 return GL_OUT_OF_MEMORY;
2944 }
2945}
2946
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002949 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002950
2951 try
2952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954
2955 if (context)
2956 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002957 GLenum nativeType;
2958 unsigned int numParams = 0;
2959 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2960 return gl::error(GL_INVALID_ENUM);
2961
2962 // pname is valid, but there are no parameters to return
2963 if (numParams == 0)
2964 return;
2965
2966 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002968 context->getIntegerv(pname, params);
2969 }
Jamie Madill55856b12014-01-02 13:59:50 -05002970 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002971 {
Jamie Madill55856b12014-01-02 13:59:50 -05002972 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 }
2974 }
2975 }
2976 catch(std::bad_alloc&)
2977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 }
2980}
2981
2982void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2983{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002984 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985
2986 try
2987 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989
2990 if (context)
2991 {
2992 gl::Program *programObject = context->getProgram(program);
2993
2994 if (!programObject)
2995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997 }
2998
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002999 if (context->getClientVersion() < 3)
3000 {
3001 switch (pname)
3002 {
3003 case GL_ACTIVE_UNIFORM_BLOCKS:
3004 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003005 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3006 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3007 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003008 return gl::error(GL_INVALID_ENUM);
3009 }
3010 }
3011
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 switch (pname)
3013 {
3014 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003015 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 return;
3017 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003018 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 return;
3020 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003021 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022 return;
3023 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003024 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 return;
3026 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003027 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 return;
3029 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003030 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 return;
3032 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003033 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 return;
3035 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003036 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 return;
3038 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003039 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003041 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003042 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003043 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003044 case GL_ACTIVE_UNIFORM_BLOCKS:
3045 *params = programObject->getActiveUniformBlockCount();
3046 return;
3047 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3048 *params = programObject->getActiveUniformBlockMaxLength();
3049 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003050 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3051 *params = programObject->getTransformFeedbackBufferMode();
3052 break;
3053 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3054 *params = programObject->getTransformFeedbackVaryingCount();
3055 break;
3056 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3057 *params = programObject->getTransformFeedbackVaryingMaxLength();
3058 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 }
3062 }
3063 }
3064 catch(std::bad_alloc&)
3065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 }
3068}
3069
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003070void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003072 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003073 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003074
3075 try
3076 {
3077 if (bufsize < 0)
3078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080 }
3081
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003083
3084 if (context)
3085 {
3086 gl::Program *programObject = context->getProgram(program);
3087
3088 if (!programObject)
3089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003091 }
3092
3093 programObject->getInfoLog(bufsize, length, infolog);
3094 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003095 }
3096 catch(std::bad_alloc&)
3097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 }
3100}
3101
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003102void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3103{
3104 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3105
3106 try
3107 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003108 gl::Context *context = gl::getNonLostContext();
3109
3110 if (context)
3111 {
Geoff Lang37dde692014-01-31 16:34:54 -05003112 if (!ValidQueryType(context, target))
3113 {
3114 return gl::error(GL_INVALID_ENUM);
3115 }
3116
3117 switch (pname)
3118 {
3119 case GL_CURRENT_QUERY_EXT:
3120 params[0] = context->getActiveQuery(target);
3121 break;
3122
3123 default:
3124 return gl::error(GL_INVALID_ENUM);
3125 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003126 }
3127 }
3128 catch(std::bad_alloc&)
3129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003131 }
3132}
3133
3134void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3135{
3136 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3137
3138 try
3139 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140 gl::Context *context = gl::getNonLostContext();
3141
3142 if (context)
3143 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003144 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3145
3146 if (!queryObject)
3147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003148 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003149 }
3150
3151 if (context->getActiveQuery(queryObject->getType()) == id)
3152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003153 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003154 }
3155
3156 switch(pname)
3157 {
3158 case GL_QUERY_RESULT_EXT:
3159 params[0] = queryObject->getResult();
3160 break;
3161 case GL_QUERY_RESULT_AVAILABLE_EXT:
3162 params[0] = queryObject->isResultAvailable();
3163 break;
3164 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003165 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003166 }
3167 }
3168 }
3169 catch(std::bad_alloc&)
3170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003171 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003172 }
3173}
3174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003175void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3176{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003177 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178
3179 try
3180 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003182
3183 if (context)
3184 {
3185 if (target != GL_RENDERBUFFER)
3186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003187 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003188 }
3189
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003190 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003193 }
3194
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003195 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003196
3197 switch (pname)
3198 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003199 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3200 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3201 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3202 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3203 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3204 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3205 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3206 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3207 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003208 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003209 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003210 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003211 *params = renderbuffer->getSamples();
3212 }
3213 else
3214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003216 }
3217 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003220 }
3221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 }
3223 catch(std::bad_alloc&)
3224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 }
3227}
3228
3229void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003231 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232
3233 try
3234 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003235 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236
3237 if (context)
3238 {
3239 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003240
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241 if (!shaderObject)
3242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003243 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003244 }
3245
3246 switch (pname)
3247 {
3248 case GL_SHADER_TYPE:
3249 *params = shaderObject->getType();
3250 return;
3251 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003252 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253 return;
3254 case GL_COMPILE_STATUS:
3255 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3256 return;
3257 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003258 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 return;
3260 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003261 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003263 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3264 *params = shaderObject->getTranslatedSourceLength();
3265 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 }
3269 }
3270 }
3271 catch(std::bad_alloc&)
3272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275}
3276
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003277void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003279 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003280 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281
3282 try
3283 {
3284 if (bufsize < 0)
3285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287 }
3288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003290
3291 if (context)
3292 {
3293 gl::Shader *shaderObject = context->getShader(shader);
3294
3295 if (!shaderObject)
3296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003298 }
3299
3300 shaderObject->getInfoLog(bufsize, length, infolog);
3301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302 }
3303 catch(std::bad_alloc&)
3304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 }
3307}
3308
3309void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003311 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003312 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313
3314 try
3315 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003316 switch (shadertype)
3317 {
3318 case GL_VERTEX_SHADER:
3319 case GL_FRAGMENT_SHADER:
3320 break;
3321 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003322 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003323 }
3324
3325 switch (precisiontype)
3326 {
3327 case GL_LOW_FLOAT:
3328 case GL_MEDIUM_FLOAT:
3329 case GL_HIGH_FLOAT:
3330 // Assume IEEE 754 precision
3331 range[0] = 127;
3332 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003333 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003334 break;
3335 case GL_LOW_INT:
3336 case GL_MEDIUM_INT:
3337 case GL_HIGH_INT:
3338 // Some (most) hardware only supports single-precision floating-point numbers,
3339 // which can accurately represent integers up to +/-16777216
3340 range[0] = 24;
3341 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003342 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003343 break;
3344 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003345 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003346 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 }
3348 catch(std::bad_alloc&)
3349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
3352}
3353
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003354void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003356 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003357 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358
3359 try
3360 {
3361 if (bufsize < 0)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003366 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003367
3368 if (context)
3369 {
3370 gl::Shader *shaderObject = context->getShader(shader);
3371
3372 if (!shaderObject)
3373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003374 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003375 }
3376
3377 shaderObject->getSource(bufsize, length, source);
3378 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 }
3380 catch(std::bad_alloc&)
3381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003382 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003383 }
3384}
3385
zmo@google.coma574f782011-10-03 21:45:23 +00003386void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3387{
3388 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3389 shader, bufsize, length, source);
3390
3391 try
3392 {
3393 if (bufsize < 0)
3394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003395 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003396 }
3397
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003398 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003399
3400 if (context)
3401 {
3402 gl::Shader *shaderObject = context->getShader(shader);
3403
3404 if (!shaderObject)
3405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003406 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003407 }
3408
3409 shaderObject->getTranslatedSource(bufsize, length, source);
3410 }
3411 }
3412 catch(std::bad_alloc&)
3413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003414 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003415 }
3416}
3417
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418const GLubyte* __stdcall glGetString(GLenum name)
3419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003420 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421
3422 try
3423 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003425
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 switch (name)
3427 {
3428 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003429 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003431 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003433 if (context->getClientVersion() == 2)
3434 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003435 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003436 }
3437 else
3438 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003439 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003440 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 if (context->getClientVersion() == 2)
3443 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003444 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003445 }
3446 else
3447 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003448 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003451 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 }
3455 }
3456 catch(std::bad_alloc&)
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460}
3461
3462void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003464 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003465
3466 try
3467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003469
3470 if (context)
3471 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003472 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003473
Jamie Madillfb8a8302013-07-03 14:24:12 -04003474 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003477 }
3478
3479 switch (pname)
3480 {
3481 case GL_TEXTURE_MAG_FILTER:
3482 *params = (GLfloat)texture->getMagFilter();
3483 break;
3484 case GL_TEXTURE_MIN_FILTER:
3485 *params = (GLfloat)texture->getMinFilter();
3486 break;
3487 case GL_TEXTURE_WRAP_S:
3488 *params = (GLfloat)texture->getWrapS();
3489 break;
3490 case GL_TEXTURE_WRAP_T:
3491 *params = (GLfloat)texture->getWrapT();
3492 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003493 case GL_TEXTURE_WRAP_R:
3494 if (context->getClientVersion() < 3)
3495 {
3496 return gl::error(GL_INVALID_ENUM);
3497 }
3498 *params = (GLfloat)texture->getWrapR();
3499 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003500 case GL_TEXTURE_IMMUTABLE_FORMAT:
3501 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003502 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3503 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003504 case GL_TEXTURE_IMMUTABLE_LEVELS:
3505 if (context->getClientVersion() < 3)
3506 {
3507 return gl::error(GL_INVALID_ENUM);
3508 }
Jamie Madill51a94372013-10-24 17:49:43 -04003509 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003510 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003511 case GL_TEXTURE_USAGE_ANGLE:
3512 *params = (GLfloat)texture->getUsage();
3513 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003514 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3515 if (!context->supportsTextureFilterAnisotropy())
3516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003517 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003518 }
3519 *params = (GLfloat)texture->getMaxAnisotropy();
3520 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003521 case GL_TEXTURE_SWIZZLE_R:
3522 if (context->getClientVersion() < 3)
3523 {
3524 return gl::error(GL_INVALID_ENUM);
3525 }
3526 *params = (GLfloat)texture->getSwizzleRed();
3527 break;
3528 case GL_TEXTURE_SWIZZLE_G:
3529 if (context->getClientVersion() < 3)
3530 {
3531 return gl::error(GL_INVALID_ENUM);
3532 }
3533 *params = (GLfloat)texture->getSwizzleGreen();
3534 break;
3535 case GL_TEXTURE_SWIZZLE_B:
3536 if (context->getClientVersion() < 3)
3537 {
3538 return gl::error(GL_INVALID_ENUM);
3539 }
3540 *params = (GLfloat)texture->getSwizzleBlue();
3541 break;
3542 case GL_TEXTURE_SWIZZLE_A:
3543 if (context->getClientVersion() < 3)
3544 {
3545 return gl::error(GL_INVALID_ENUM);
3546 }
3547 *params = (GLfloat)texture->getSwizzleAlpha();
3548 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003549 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003551 }
3552 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553 }
3554 catch(std::bad_alloc&)
3555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003556 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003557 }
3558}
3559
3560void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003562 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003563
3564 try
3565 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003567
3568 if (context)
3569 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003570 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003571
Jamie Madillfb8a8302013-07-03 14:24:12 -04003572 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003575 }
3576
3577 switch (pname)
3578 {
3579 case GL_TEXTURE_MAG_FILTER:
3580 *params = texture->getMagFilter();
3581 break;
3582 case GL_TEXTURE_MIN_FILTER:
3583 *params = texture->getMinFilter();
3584 break;
3585 case GL_TEXTURE_WRAP_S:
3586 *params = texture->getWrapS();
3587 break;
3588 case GL_TEXTURE_WRAP_T:
3589 *params = texture->getWrapT();
3590 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003591 case GL_TEXTURE_WRAP_R:
3592 if (context->getClientVersion() < 3)
3593 {
3594 return gl::error(GL_INVALID_ENUM);
3595 }
3596 *params = texture->getWrapR();
3597 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003598 case GL_TEXTURE_IMMUTABLE_FORMAT:
3599 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003600 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3601 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003602 case GL_TEXTURE_IMMUTABLE_LEVELS:
3603 if (context->getClientVersion() < 3)
3604 {
3605 return gl::error(GL_INVALID_ENUM);
3606 }
Jamie Madill51a94372013-10-24 17:49:43 -04003607 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003608 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003609 case GL_TEXTURE_USAGE_ANGLE:
3610 *params = texture->getUsage();
3611 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003612 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3613 if (!context->supportsTextureFilterAnisotropy())
3614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003615 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003616 }
3617 *params = (GLint)texture->getMaxAnisotropy();
3618 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003619 case GL_TEXTURE_SWIZZLE_R:
3620 if (context->getClientVersion() < 3)
3621 {
3622 return gl::error(GL_INVALID_ENUM);
3623 }
3624 *params = texture->getSwizzleRed();
3625 break;
3626 case GL_TEXTURE_SWIZZLE_G:
3627 if (context->getClientVersion() < 3)
3628 {
3629 return gl::error(GL_INVALID_ENUM);
3630 }
3631 *params = texture->getSwizzleGreen();
3632 break;
3633 case GL_TEXTURE_SWIZZLE_B:
3634 if (context->getClientVersion() < 3)
3635 {
3636 return gl::error(GL_INVALID_ENUM);
3637 }
3638 *params = texture->getSwizzleBlue();
3639 break;
3640 case GL_TEXTURE_SWIZZLE_A:
3641 if (context->getClientVersion() < 3)
3642 {
3643 return gl::error(GL_INVALID_ENUM);
3644 }
3645 *params = texture->getSwizzleAlpha();
3646 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003647
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003648 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003650 }
3651 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003652 }
3653 catch(std::bad_alloc&)
3654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003656 }
3657}
3658
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003659void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3660{
3661 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3662 program, location, bufSize, params);
3663
3664 try
3665 {
3666 if (bufSize < 0)
3667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003669 }
3670
3671 gl::Context *context = gl::getNonLostContext();
3672
3673 if (context)
3674 {
3675 if (program == 0)
3676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003678 }
3679
3680 gl::Program *programObject = context->getProgram(program);
3681
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003682 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003685 }
3686
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003687 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3688 if (!programBinary)
3689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003690 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003691 }
3692
3693 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003696 }
3697 }
3698 }
3699 catch(std::bad_alloc&)
3700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003702 }
3703}
3704
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3706{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003707 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003708
3709 try
3710 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003711 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003712
3713 if (context)
3714 {
3715 if (program == 0)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003718 }
3719
3720 gl::Program *programObject = context->getProgram(program);
3721
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003722 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003725 }
3726
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003727 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3728 if (!programBinary)
3729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003730 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003731 }
3732
3733 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003736 }
3737 }
3738 }
3739 catch(std::bad_alloc&)
3740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003742 }
3743}
3744
3745void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3746{
3747 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3748 program, location, bufSize, params);
3749
3750 try
3751 {
3752 if (bufSize < 0)
3753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003754 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003755 }
3756
3757 gl::Context *context = gl::getNonLostContext();
3758
3759 if (context)
3760 {
3761 if (program == 0)
3762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003764 }
3765
3766 gl::Program *programObject = context->getProgram(program);
3767
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003768 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003770 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003771 }
3772
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003773 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3774 if (!programBinary)
3775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003776 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003777 }
3778
3779 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003782 }
3783 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784 }
3785 catch(std::bad_alloc&)
3786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003788 }
3789}
3790
3791void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003793 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794
3795 try
3796 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003797 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003798
3799 if (context)
3800 {
3801 if (program == 0)
3802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003804 }
3805
3806 gl::Program *programObject = context->getProgram(program);
3807
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003808 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003811 }
3812
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003813 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3814 if (!programBinary)
3815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003816 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003817 }
3818
3819 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003822 }
3823 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824 }
3825 catch(std::bad_alloc&)
3826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003828 }
3829}
3830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003831int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003833 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834
3835 try
3836 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003838
3839 if (strstr(name, "gl_") == name)
3840 {
3841 return -1;
3842 }
3843
3844 if (context)
3845 {
3846 gl::Program *programObject = context->getProgram(program);
3847
3848 if (!programObject)
3849 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003850 if (context->getShader(program))
3851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003852 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003853 }
3854 else
3855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003856 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003857 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858 }
3859
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003860 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003861 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003864 }
3865
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003866 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 }
3868 }
3869 catch(std::bad_alloc&)
3870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003872 }
3873
3874 return -1;
3875}
3876
3877void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003879 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880
3881 try
3882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003884
daniel@transgaming.come0078962010-04-15 20:45:08 +00003885 if (context)
3886 {
3887 if (index >= gl::MAX_VERTEX_ATTRIBS)
3888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003890 }
3891
daniel@transgaming.com83921382011-01-08 05:46:00 +00003892 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003893
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003894 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003895 {
Jamie Madillaff71502013-07-02 11:57:05 -04003896 return;
3897 }
3898
3899 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3900 {
3901 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3902 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003903 {
Jamie Madillaff71502013-07-02 11:57:05 -04003904 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 }
Jamie Madillaff71502013-07-02 11:57:05 -04003906 }
3907 else
3908 {
3909 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003910 }
3911 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912 }
3913 catch(std::bad_alloc&)
3914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003915 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916 }
3917}
3918
3919void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3920{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003921 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922
3923 try
3924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926
daniel@transgaming.come0078962010-04-15 20:45:08 +00003927 if (context)
3928 {
3929 if (index >= gl::MAX_VERTEX_ATTRIBS)
3930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003932 }
3933
daniel@transgaming.com83921382011-01-08 05:46:00 +00003934 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003935
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003936 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003937 {
Jamie Madillaff71502013-07-02 11:57:05 -04003938 return;
3939 }
3940
3941 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3942 {
3943 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3944 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003945 {
Jamie Madillaff71502013-07-02 11:57:05 -04003946 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003947 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003948 }
Jamie Madillaff71502013-07-02 11:57:05 -04003949 }
3950 else
3951 {
3952 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003953 }
3954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003955 }
3956 catch(std::bad_alloc&)
3957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 }
3960}
3961
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003962void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003964 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965
3966 try
3967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003969
daniel@transgaming.come0078962010-04-15 20:45:08 +00003970 if (context)
3971 {
3972 if (index >= gl::MAX_VERTEX_ATTRIBS)
3973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003975 }
3976
3977 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003979 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003980 }
3981
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003982 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984 }
3985 catch(std::bad_alloc&)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988 }
3989}
3990
3991void __stdcall glHint(GLenum target, GLenum mode)
3992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003993 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994
3995 try
3996 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003997 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003998 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003999 case GL_FASTEST:
4000 case GL_NICEST:
4001 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004002 break;
4003 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004005 }
4006
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004007 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004008 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004009 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004010 case GL_GENERATE_MIPMAP_HINT:
4011 if (context) context->setGenerateMipmapHint(mode);
4012 break;
4013 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4014 if (context) context->setFragmentShaderDerivativeHint(mode);
4015 break;
4016 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 }
4020 catch(std::bad_alloc&)
4021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 }
4024}
4025
4026GLboolean __stdcall glIsBuffer(GLuint buffer)
4027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004028 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029
4030 try
4031 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033
4034 if (context && buffer)
4035 {
4036 gl::Buffer *bufferObject = context->getBuffer(buffer);
4037
4038 if (bufferObject)
4039 {
4040 return GL_TRUE;
4041 }
4042 }
4043 }
4044 catch(std::bad_alloc&)
4045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047 }
4048
4049 return GL_FALSE;
4050}
4051
4052GLboolean __stdcall glIsEnabled(GLenum cap)
4053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004054 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055
4056 try
4057 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059
4060 if (context)
4061 {
Geoff Lang0550d032014-01-30 11:29:07 -05004062 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004064 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065 }
Geoff Lang0550d032014-01-30 11:29:07 -05004066
4067 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068 }
4069 }
4070 catch(std::bad_alloc&)
4071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004072 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073 }
4074
4075 return false;
4076}
4077
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004078GLboolean __stdcall glIsFenceNV(GLuint fence)
4079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004080 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004081
4082 try
4083 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004084 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004085
4086 if (context)
4087 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004088 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004089
4090 if (fenceObject == NULL)
4091 {
4092 return GL_FALSE;
4093 }
4094
4095 return fenceObject->isFence();
4096 }
4097 }
4098 catch(std::bad_alloc&)
4099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004100 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004101 }
4102
4103 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004104}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004108 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004109
4110 try
4111 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004112 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113
4114 if (context && framebuffer)
4115 {
4116 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4117
4118 if (framebufferObject)
4119 {
4120 return GL_TRUE;
4121 }
4122 }
4123 }
4124 catch(std::bad_alloc&)
4125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004126 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127 }
4128
4129 return GL_FALSE;
4130}
4131
4132GLboolean __stdcall glIsProgram(GLuint program)
4133{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004134 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004135
4136 try
4137 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004138 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004139
4140 if (context && program)
4141 {
4142 gl::Program *programObject = context->getProgram(program);
4143
4144 if (programObject)
4145 {
4146 return GL_TRUE;
4147 }
4148 }
4149 }
4150 catch(std::bad_alloc&)
4151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004152 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153 }
4154
4155 return GL_FALSE;
4156}
4157
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004158GLboolean __stdcall glIsQueryEXT(GLuint id)
4159{
4160 EVENT("(GLuint id = %d)", id);
4161
4162 try
4163 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004164 gl::Context *context = gl::getNonLostContext();
4165
4166 if (context)
4167 {
Geoff Lang37dde692014-01-31 16:34:54 -05004168 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004169 }
4170 }
4171 catch(std::bad_alloc&)
4172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004174 }
4175
4176 return GL_FALSE;
4177}
4178
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004181 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182
4183 try
4184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004186
4187 if (context && renderbuffer)
4188 {
4189 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4190
4191 if (renderbufferObject)
4192 {
4193 return GL_TRUE;
4194 }
4195 }
4196 }
4197 catch(std::bad_alloc&)
4198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201
4202 return GL_FALSE;
4203}
4204
4205GLboolean __stdcall glIsShader(GLuint shader)
4206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004207 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208
4209 try
4210 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 if (context && shader)
4214 {
4215 gl::Shader *shaderObject = context->getShader(shader);
4216
4217 if (shaderObject)
4218 {
4219 return GL_TRUE;
4220 }
4221 }
4222 }
4223 catch(std::bad_alloc&)
4224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004225 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226 }
4227
4228 return GL_FALSE;
4229}
4230
4231GLboolean __stdcall glIsTexture(GLuint texture)
4232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004233 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004234
4235 try
4236 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238
4239 if (context && texture)
4240 {
4241 gl::Texture *textureObject = context->getTexture(texture);
4242
4243 if (textureObject)
4244 {
4245 return GL_TRUE;
4246 }
4247 }
4248 }
4249 catch(std::bad_alloc&)
4250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004251 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 }
4253
4254 return GL_FALSE;
4255}
4256
4257void __stdcall glLineWidth(GLfloat width)
4258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004259 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260
4261 try
4262 {
4263 if (width <= 0.0f)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004268 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004269
4270 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004271 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004272 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 }
4274 }
4275 catch(std::bad_alloc&)
4276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004278 }
4279}
4280
4281void __stdcall glLinkProgram(GLuint program)
4282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004283 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004284
4285 try
4286 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288
4289 if (context)
4290 {
4291 gl::Program *programObject = context->getProgram(program);
4292
4293 if (!programObject)
4294 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004295 if (context->getShader(program))
4296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004297 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004298 }
4299 else
4300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004301 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303 }
4304
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004305 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 }
4307 }
4308 catch(std::bad_alloc&)
4309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311 }
4312}
4313
4314void __stdcall glPixelStorei(GLenum pname, GLint param)
4315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004316 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004317
4318 try
4319 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004321
4322 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004324 switch (pname)
4325 {
4326 case GL_UNPACK_ALIGNMENT:
4327 if (param != 1 && param != 2 && param != 4 && param != 8)
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004330 }
4331
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004332 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004333 break;
4334
4335 case GL_PACK_ALIGNMENT:
4336 if (param != 1 && param != 2 && param != 4 && param != 8)
4337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004338 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004339 }
4340
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004341 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004342 break;
4343
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004344 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4345 context->setPackReverseRowOrder(param != 0);
4346 break;
4347
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004348 case GL_UNPACK_IMAGE_HEIGHT:
4349 case GL_UNPACK_SKIP_IMAGES:
4350 case GL_UNPACK_ROW_LENGTH:
4351 case GL_UNPACK_SKIP_ROWS:
4352 case GL_UNPACK_SKIP_PIXELS:
4353 case GL_PACK_ROW_LENGTH:
4354 case GL_PACK_SKIP_ROWS:
4355 case GL_PACK_SKIP_PIXELS:
4356 if (context->getClientVersion() < 3)
4357 {
4358 return gl::error(GL_INVALID_ENUM);
4359 }
4360 UNIMPLEMENTED();
4361 break;
4362
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004363 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004365 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366 }
4367 }
4368 catch(std::bad_alloc&)
4369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 }
4372}
4373
4374void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004376 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377
4378 try
4379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004381
4382 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004384 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385 }
4386 }
4387 catch(std::bad_alloc&)
4388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004389 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004390 }
4391}
4392
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004393void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4394 GLenum format, GLenum type, GLsizei bufSize,
4395 GLvoid *data)
4396{
4397 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4398 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4399 x, y, width, height, format, type, bufSize, data);
4400
4401 try
4402 {
4403 if (width < 0 || height < 0 || bufSize < 0)
4404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004406 }
4407
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004408 gl::Context *context = gl::getNonLostContext();
4409
4410 if (context)
4411 {
Jamie Madill26e91952014-03-05 15:01:27 -05004412 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4413 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004414 {
Jamie Madill26e91952014-03-05 15:01:27 -05004415 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004416 }
4417
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004418 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4419 }
4420 }
4421 catch(std::bad_alloc&)
4422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004424 }
4425}
4426
4427void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4428 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004430 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004431 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004432 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 try
4435 {
4436 if (width < 0 || height < 0)
4437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439 }
4440
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
4443 if (context)
4444 {
Jamie Madill26e91952014-03-05 15:01:27 -05004445 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4446 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004447 {
Jamie Madill26e91952014-03-05 15:01:27 -05004448 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004449 }
4450
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004451 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452 }
4453 }
4454 catch(std::bad_alloc&)
4455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004457 }
4458}
4459
4460void __stdcall glReleaseShaderCompiler(void)
4461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004462 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463
4464 try
4465 {
4466 gl::Shader::releaseCompiler();
4467 }
4468 catch(std::bad_alloc&)
4469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 }
4472}
4473
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004474void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004476 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004477 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004478
4479 try
4480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482
4483 if (context)
4484 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004485 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004486 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004487 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004488 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004490
4491 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492 }
4493 }
4494 catch(std::bad_alloc&)
4495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497 }
4498}
4499
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004500void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4501{
4502 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4503}
4504
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4506{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004507 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508
4509 try
4510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004511 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004512
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513 if (context)
4514 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004515 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
4517 }
4518 catch(std::bad_alloc&)
4519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521 }
4522}
4523
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004524void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004527
4528 try
4529 {
4530 if (condition != GL_ALL_COMPLETED_NV)
4531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004532 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004533 }
4534
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004535 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004536
4537 if (context)
4538 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004539 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004540
4541 if (fenceObject == NULL)
4542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004543 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004544 }
4545
4546 fenceObject->setFence(condition);
4547 }
4548 }
4549 catch(std::bad_alloc&)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004552 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004553}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004554
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004557 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558
4559 try
4560 {
4561 if (width < 0 || height < 0)
4562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 }
4565
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004566 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 if (context)
4569 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004570 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 }
4572 }
4573 catch(std::bad_alloc&)
4574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004575 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576 }
4577}
4578
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004579void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004581 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004582 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004583 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584
4585 try
4586 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004587 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004589 }
4590 catch(std::bad_alloc&)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594}
4595
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004596void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004598 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004599 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 try
4602 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004603 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606 }
4607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609
4610 if (context)
4611 {
4612 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004613
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614 if (!shaderObject)
4615 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004616 if (context->getProgram(shader))
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004619 }
4620 else
4621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004623 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 }
4625
4626 shaderObject->setSource(count, string, length);
4627 }
4628 }
4629 catch(std::bad_alloc&)
4630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004631 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633}
4634
4635void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4636{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004637 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638}
4639
4640void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004642 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643
4644 try
4645 {
4646 switch (face)
4647 {
4648 case GL_FRONT:
4649 case GL_BACK:
4650 case GL_FRONT_AND_BACK:
4651 break;
4652 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655
4656 switch (func)
4657 {
4658 case GL_NEVER:
4659 case GL_ALWAYS:
4660 case GL_LESS:
4661 case GL_LEQUAL:
4662 case GL_EQUAL:
4663 case GL_GEQUAL:
4664 case GL_GREATER:
4665 case GL_NOTEQUAL:
4666 break;
4667 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 }
4670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004671 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672
4673 if (context)
4674 {
4675 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4676 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004677 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 }
4679
4680 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4681 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004682 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683 }
4684 }
4685 }
4686 catch(std::bad_alloc&)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690}
4691
4692void __stdcall glStencilMask(GLuint mask)
4693{
4694 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4695}
4696
4697void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4698{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004699 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700
4701 try
4702 {
4703 switch (face)
4704 {
4705 case GL_FRONT:
4706 case GL_BACK:
4707 case GL_FRONT_AND_BACK:
4708 break;
4709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714
4715 if (context)
4716 {
4717 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4718 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004719 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 }
4721
4722 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4723 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004724 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725 }
4726 }
4727 }
4728 catch(std::bad_alloc&)
4729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731 }
4732}
4733
4734void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4735{
4736 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4737}
4738
4739void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004741 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004742 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743
4744 try
4745 {
4746 switch (face)
4747 {
4748 case GL_FRONT:
4749 case GL_BACK:
4750 case GL_FRONT_AND_BACK:
4751 break;
4752 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 }
4755
4756 switch (fail)
4757 {
4758 case GL_ZERO:
4759 case GL_KEEP:
4760 case GL_REPLACE:
4761 case GL_INCR:
4762 case GL_DECR:
4763 case GL_INVERT:
4764 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004765 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 break;
4767 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770
4771 switch (zfail)
4772 {
4773 case GL_ZERO:
4774 case GL_KEEP:
4775 case GL_REPLACE:
4776 case GL_INCR:
4777 case GL_DECR:
4778 case GL_INVERT:
4779 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004780 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 break;
4782 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 }
4785
4786 switch (zpass)
4787 {
4788 case GL_ZERO:
4789 case GL_KEEP:
4790 case GL_REPLACE:
4791 case GL_INCR:
4792 case GL_DECR:
4793 case GL_INVERT:
4794 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004795 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796 break;
4797 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004798 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 }
4800
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
4803 if (context)
4804 {
4805 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4806 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004807 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 }
4809
4810 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4811 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004812 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814 }
4815 }
4816 catch(std::bad_alloc&)
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819 }
4820}
4821
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004822GLboolean __stdcall glTestFenceNV(GLuint fence)
4823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004824 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004825
4826 try
4827 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004828 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004829
4830 if (context)
4831 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004832 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004833
4834 if (fenceObject == NULL)
4835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004836 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004837 }
4838
Jamie Madillfb9a7402013-07-26 11:55:01 -04004839 if (fenceObject->isFence() != GL_TRUE)
4840 {
4841 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4842 }
4843
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004844 return fenceObject->testFence();
4845 }
4846 }
4847 catch(std::bad_alloc&)
4848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004849 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004850 }
4851
4852 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004853}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004854
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004855void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4856 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004858 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004859 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004860 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861
4862 try
4863 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 if (context)
4867 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004868 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004869 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004870 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004871 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004872 return;
4873 }
4874
4875 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004876 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004877 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004878 {
4879 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004880 }
4881
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004882 switch (target)
4883 {
4884 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004885 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004886 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004887 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004888 }
4889 break;
4890 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004891 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004892 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004893 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004895 break;
4896 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4897 {
4898 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004899 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004900 }
4901 break;
4902 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4903 {
4904 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004905 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004906 }
4907 break;
4908 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4909 {
4910 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004911 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004912 }
4913 break;
4914 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4915 {
4916 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004917 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004918 }
4919 break;
4920 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4921 {
4922 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004923 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004924 }
4925 break;
4926 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004927 }
4928 }
4929 }
4930 catch(std::bad_alloc&)
4931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933 }
4934}
4935
4936void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4937{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004938 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4939
4940 try
4941 {
4942 gl::Context *context = gl::getNonLostContext();
4943
4944 if (context)
4945 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004946 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004947 {
4948 return;
4949 }
4950
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004951 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004952
Jamie Madillfb8a8302013-07-03 14:24:12 -04004953 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004955 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004956 }
4957
4958 switch (pname)
4959 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004960 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4961 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4962 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4963 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4964 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4965 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4966 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4967 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4968 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004969 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4970 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4971 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4972 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004973
Jamie Madill478fdb22013-07-19 16:36:59 -04004974 case GL_TEXTURE_BASE_LEVEL:
4975 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004976 case GL_TEXTURE_MIN_LOD:
4977 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004978 UNIMPLEMENTED();
4979 break;
4980
Jamie Madill478fdb22013-07-19 16:36:59 -04004981 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004982 }
4983 }
4984 }
4985 catch(std::bad_alloc&)
4986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989}
4990
4991void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4992{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004993 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994}
4995
4996void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004998 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004999
5000 try
5001 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005003
5004 if (context)
5005 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005006 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005007 {
5008 return;
5009 }
5010
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005011 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012
Jamie Madillfb8a8302013-07-03 14:24:12 -04005013 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 }
5017
5018 switch (pname)
5019 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005020 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5021 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5022 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5023 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5024 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5025 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5026 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5027 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5028 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005029 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5030 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5031 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5032 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005033
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005034 case GL_TEXTURE_BASE_LEVEL:
5035 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005036 case GL_TEXTURE_MIN_LOD:
5037 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005038 UNIMPLEMENTED();
5039 break;
5040
Jamie Madill478fdb22013-07-19 16:36:59 -04005041 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043 }
5044 }
5045 catch(std::bad_alloc&)
5046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005047 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005048 }
5049}
5050
5051void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5052{
5053 glTexParameteri(target, pname, *params);
5054}
5055
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005056void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5057{
5058 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5059 target, levels, internalformat, width, height);
5060
5061 try
5062 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005063 gl::Context *context = gl::getNonLostContext();
5064
5065 if (context)
5066 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005067 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005068 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005069 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005070 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005071 }
5072
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005073 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005074 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005075 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005076 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005077 }
5078
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005079 switch (target)
5080 {
5081 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005082 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005083 gl::Texture2D *texture2d = context->getTexture2D();
5084 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005085 }
5086 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005087
Geoff Lang01c21d22013-09-24 11:52:16 -04005088 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005089 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005090 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5091 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005092 }
5093 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005094
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005095 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005097 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005098 }
5099 }
5100 catch(std::bad_alloc&)
5101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005103 }
5104}
5105
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005106void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5107 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005109 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005110 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005111 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005112 target, level, xoffset, yoffset, width, height, format, type, pixels);
5113
5114 try
5115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005117
5118 if (context)
5119 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005120 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005121 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005122 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005123 {
5124 return;
5125 }
5126
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005127 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005128 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005129 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005130 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005131 return;
5132 }
5133
5134 switch (target)
5135 {
5136 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005137 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005138 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005139 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005140 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005141 break;
5142
5143 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5144 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5145 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5146 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5147 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5148 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005149 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005150 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005151 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005152 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005153 break;
5154
5155 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005156 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005157 }
5158 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159 }
5160 catch(std::bad_alloc&)
5161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163 }
5164}
5165
5166void __stdcall glUniform1f(GLint location, GLfloat x)
5167{
5168 glUniform1fv(location, 1, &x);
5169}
5170
5171void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005173 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174
5175 try
5176 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177 if (count < 0)
5178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005182 if (location == -1)
5183 {
5184 return;
5185 }
5186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188
5189 if (context)
5190 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005191 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005192 if (!programBinary)
5193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005195 }
5196
5197 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200 }
5201 }
5202 }
5203 catch(std::bad_alloc&)
5204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206 }
5207}
5208
5209void __stdcall glUniform1i(GLint location, GLint x)
5210{
5211 glUniform1iv(location, 1, &x);
5212}
5213
5214void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005216 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217
5218 try
5219 {
5220 if (count < 0)
5221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223 }
5224
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005225 if (location == -1)
5226 {
5227 return;
5228 }
5229
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005230 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231
5232 if (context)
5233 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005234 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005235 if (!programBinary)
5236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005237 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005238 }
5239
5240 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005242 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243 }
5244 }
5245 }
5246 catch(std::bad_alloc&)
5247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005249 }
5250}
5251
5252void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5253{
5254 GLfloat xy[2] = {x, y};
5255
5256 glUniform2fv(location, 1, (GLfloat*)&xy);
5257}
5258
5259void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005261 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262
5263 try
5264 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 if (count < 0)
5266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005269
5270 if (location == -1)
5271 {
5272 return;
5273 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 if (context)
5278 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005279 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005280 if (!programBinary)
5281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005282 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005283 }
5284
5285 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005287 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 }
5289 }
5290 }
5291 catch(std::bad_alloc&)
5292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005294 }
5295}
5296
5297void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5298{
5299 GLint xy[4] = {x, y};
5300
5301 glUniform2iv(location, 1, (GLint*)&xy);
5302}
5303
5304void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005306 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 try
5309 {
5310 if (count < 0)
5311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005312 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005315 if (location == -1)
5316 {
5317 return;
5318 }
5319
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005321
5322 if (context)
5323 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005324 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005325 if (!programBinary)
5326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005327 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005328 }
5329
5330 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005333 }
5334 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336 catch(std::bad_alloc&)
5337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 }
5340}
5341
5342void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5343{
5344 GLfloat xyz[3] = {x, y, z};
5345
5346 glUniform3fv(location, 1, (GLfloat*)&xyz);
5347}
5348
5349void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005351 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352
5353 try
5354 {
5355 if (count < 0)
5356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358 }
5359
5360 if (location == -1)
5361 {
5362 return;
5363 }
5364
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366
5367 if (context)
5368 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005369 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005370 if (!programBinary)
5371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005372 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005373 }
5374
5375 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005377 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378 }
5379 }
5380 }
5381 catch(std::bad_alloc&)
5382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005384 }
5385}
5386
5387void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5388{
5389 GLint xyz[3] = {x, y, z};
5390
5391 glUniform3iv(location, 1, (GLint*)&xyz);
5392}
5393
5394void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005396 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397
5398 try
5399 {
5400 if (count < 0)
5401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005402 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403 }
5404
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005405 if (location == -1)
5406 {
5407 return;
5408 }
5409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005411
5412 if (context)
5413 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005414 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005415 if (!programBinary)
5416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005418 }
5419
5420 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005423 }
5424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426 catch(std::bad_alloc&)
5427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429 }
5430}
5431
5432void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5433{
5434 GLfloat xyzw[4] = {x, y, z, w};
5435
5436 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5437}
5438
5439void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005441 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442
5443 try
5444 {
5445 if (count < 0)
5446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449
5450 if (location == -1)
5451 {
5452 return;
5453 }
5454
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456
5457 if (context)
5458 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005459 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005460 if (!programBinary)
5461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005462 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005463 }
5464
5465 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 }
5469 }
5470 }
5471 catch(std::bad_alloc&)
5472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474 }
5475}
5476
5477void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5478{
5479 GLint xyzw[4] = {x, y, z, w};
5480
5481 glUniform4iv(location, 1, (GLint*)&xyzw);
5482}
5483
5484void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5485{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005486 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487
5488 try
5489 {
5490 if (count < 0)
5491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493 }
5494
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005495 if (location == -1)
5496 {
5497 return;
5498 }
5499
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005501
5502 if (context)
5503 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005504 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005505 if (!programBinary)
5506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005508 }
5509
5510 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005513 }
5514 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
5516 catch(std::bad_alloc&)
5517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 }
5520}
5521
5522void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5523{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005524 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005525 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526
5527 try
5528 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005529 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 }
5533
5534 if (location == -1)
5535 {
5536 return;
5537 }
5538
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540
5541 if (context)
5542 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005543 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5544 {
5545 return gl::error(GL_INVALID_VALUE);
5546 }
5547
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005548 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005549 if (!programBinary)
5550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005551 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005552 }
5553
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005554 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 }
5558 }
5559 }
5560 catch(std::bad_alloc&)
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564}
5565
5566void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5567{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005568 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005569 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570
5571 try
5572 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005573 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576 }
5577
5578 if (location == -1)
5579 {
5580 return;
5581 }
5582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
5585 if (context)
5586 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005587 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5588 {
5589 return gl::error(GL_INVALID_VALUE);
5590 }
5591
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005592 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005593 if (!programBinary)
5594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005595 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005596 }
5597
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005598 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005600 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 }
5602 }
5603 }
5604 catch(std::bad_alloc&)
5605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005606 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 }
5608}
5609
5610void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5611{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005612 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005613 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614
5615 try
5616 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005617 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 }
5621
5622 if (location == -1)
5623 {
5624 return;
5625 }
5626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628
5629 if (context)
5630 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005631 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5632 {
5633 return gl::error(GL_INVALID_VALUE);
5634 }
5635
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005636 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005637 if (!programBinary)
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005640 }
5641
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005642 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 }
5646 }
5647 }
5648 catch(std::bad_alloc&)
5649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 }
5652}
5653
5654void __stdcall glUseProgram(GLuint program)
5655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005656 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657
5658 try
5659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 if (context)
5663 {
5664 gl::Program *programObject = context->getProgram(program);
5665
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005666 if (!programObject && program != 0)
5667 {
5668 if (context->getShader(program))
5669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005671 }
5672 else
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005675 }
5676 }
5677
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005678 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005681 }
5682
5683 context->useProgram(program);
5684 }
5685 }
5686 catch(std::bad_alloc&)
5687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689 }
5690}
5691
5692void __stdcall glValidateProgram(GLuint program)
5693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005694 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695
5696 try
5697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005699
5700 if (context)
5701 {
5702 gl::Program *programObject = context->getProgram(program);
5703
5704 if (!programObject)
5705 {
5706 if (context->getShader(program))
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005709 }
5710 else
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005713 }
5714 }
5715
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005716 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005717 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719 catch(std::bad_alloc&)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723}
5724
5725void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005727 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728
5729 try
5730 {
5731 if (index >= gl::MAX_VERTEX_ATTRIBS)
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
5735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005737
5738 if (context)
5739 {
5740 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005741 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005742 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 }
5744 catch(std::bad_alloc&)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748}
5749
5750void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005752 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753
5754 try
5755 {
5756 if (index >= gl::MAX_VERTEX_ATTRIBS)
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 }
5760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005761 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005762
5763 if (context)
5764 {
5765 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005766 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005767 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005768 }
5769 catch(std::bad_alloc&)
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773}
5774
5775void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005777 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778
5779 try
5780 {
5781 if (index >= gl::MAX_VERTEX_ATTRIBS)
5782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005784 }
5785
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005787
5788 if (context)
5789 {
5790 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005791 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005792 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794 catch(std::bad_alloc&)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798}
5799
5800void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005802 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803
5804 try
5805 {
5806 if (index >= gl::MAX_VERTEX_ATTRIBS)
5807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809 }
5810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005812
5813 if (context)
5814 {
5815 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005816 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005817 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819 catch(std::bad_alloc&)
5820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823}
5824
5825void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005827 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005828
5829 try
5830 {
5831 if (index >= gl::MAX_VERTEX_ATTRIBS)
5832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834 }
5835
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005836 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005837
5838 if (context)
5839 {
5840 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005841 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005842 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 }
5844 catch(std::bad_alloc&)
5845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848}
5849
5850void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005852 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853
5854 try
5855 {
5856 if (index >= gl::MAX_VERTEX_ATTRIBS)
5857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 }
5860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005862
5863 if (context)
5864 {
5865 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005866 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005867 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 }
5869 catch(std::bad_alloc&)
5870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873}
5874
5875void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005877 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878
5879 try
5880 {
5881 if (index >= gl::MAX_VERTEX_ATTRIBS)
5882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005887
5888 if (context)
5889 {
5890 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005891 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005893 }
5894 catch(std::bad_alloc&)
5895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898}
5899
5900void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005902 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005903
5904 try
5905 {
5906 if (index >= gl::MAX_VERTEX_ATTRIBS)
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
5910
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005912
5913 if (context)
5914 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005915 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005917 }
5918 catch(std::bad_alloc&)
5919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921 }
5922}
5923
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005924void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5925{
5926 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5927
5928 try
5929 {
5930 if (index >= gl::MAX_VERTEX_ATTRIBS)
5931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005932 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005933 }
5934
5935 gl::Context *context = gl::getNonLostContext();
5936
5937 if (context)
5938 {
5939 context->setVertexAttribDivisor(index, divisor);
5940 }
5941 }
5942 catch(std::bad_alloc&)
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005945 }
5946}
5947
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005948void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005950 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005951 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005952 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953
5954 try
5955 {
5956 if (index >= gl::MAX_VERTEX_ATTRIBS)
5957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959 }
5960
5961 if (size < 1 || size > 4)
5962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005963 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005966 gl::Context *context = gl::getNonLostContext();
5967
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 switch (type)
5969 {
5970 case GL_BYTE:
5971 case GL_UNSIGNED_BYTE:
5972 case GL_SHORT:
5973 case GL_UNSIGNED_SHORT:
5974 case GL_FIXED:
5975 case GL_FLOAT:
5976 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005977 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005978 case GL_INT:
5979 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005980 case GL_INT_2_10_10_10_REV:
5981 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005982 if (context && context->getClientVersion() < 3)
5983 {
5984 return gl::error(GL_INVALID_ENUM);
5985 }
5986 else
5987 {
5988 break;
5989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992 }
5993
5994 if (stride < 0)
5995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005999 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6000 {
6001 return gl::error(GL_INVALID_OPERATION);
6002 }
6003
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004 if (context)
6005 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006006 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6007 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6008 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6009 // and the pointer argument is not NULL.
6010 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6011 {
6012 return gl::error(GL_INVALID_OPERATION);
6013 }
6014
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006015 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6016 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006017 }
6018 }
6019 catch(std::bad_alloc&)
6020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023}
6024
6025void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6026{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006027 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006028
6029 try
6030 {
6031 if (width < 0 || height < 0)
6032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006034 }
6035
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037
6038 if (context)
6039 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006040 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041 }
6042 }
6043 catch(std::bad_alloc&)
6044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006045 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046 }
6047}
6048
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006049// OpenGL ES 3.0 functions
6050
6051void __stdcall glReadBuffer(GLenum mode)
6052{
6053 EVENT("(GLenum mode = 0x%X)", mode);
6054
6055 try
6056 {
6057 gl::Context *context = gl::getNonLostContext();
6058
6059 if (context)
6060 {
6061 if (context->getClientVersion() < 3)
6062 {
6063 return gl::error(GL_INVALID_OPERATION);
6064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006065
Jamie Madill54133512013-06-21 09:33:07 -04006066 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006067 UNIMPLEMENTED();
6068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006069 }
6070 catch(std::bad_alloc&)
6071 {
6072 return gl::error(GL_OUT_OF_MEMORY);
6073 }
6074}
6075
6076void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6077{
6078 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6079 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6080
6081 try
6082 {
6083 gl::Context *context = gl::getNonLostContext();
6084
6085 if (context)
6086 {
6087 if (context->getClientVersion() < 3)
6088 {
6089 return gl::error(GL_INVALID_OPERATION);
6090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006091
Jamie Madill54133512013-06-21 09:33:07 -04006092 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006093 UNIMPLEMENTED();
6094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006095 }
6096 catch(std::bad_alloc&)
6097 {
6098 return gl::error(GL_OUT_OF_MEMORY);
6099 }
6100}
6101
6102void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6103{
6104 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6105 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6106 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6107 target, level, internalformat, width, height, depth, border, format, type, pixels);
6108
6109 try
6110 {
6111 gl::Context *context = gl::getNonLostContext();
6112
6113 if (context)
6114 {
6115 if (context->getClientVersion() < 3)
6116 {
6117 return gl::error(GL_INVALID_OPERATION);
6118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006119
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006120 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006121 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006122 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006123 {
6124 return;
6125 }
6126
6127 switch(target)
6128 {
6129 case GL_TEXTURE_3D:
6130 {
6131 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006132 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006133 }
6134 break;
6135
6136 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006137 {
6138 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006139 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006140 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006141 break;
6142
6143 default:
6144 return gl::error(GL_INVALID_ENUM);
6145 }
6146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006147 }
6148 catch(std::bad_alloc&)
6149 {
6150 return gl::error(GL_OUT_OF_MEMORY);
6151 }
6152}
6153
6154void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
6155{
6156 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6157 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6158 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6159 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6160
6161 try
6162 {
6163 gl::Context *context = gl::getNonLostContext();
6164
6165 if (context)
6166 {
6167 if (context->getClientVersion() < 3)
6168 {
6169 return gl::error(GL_INVALID_OPERATION);
6170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006171
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006172 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006173 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006174 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006175 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006176 {
6177 return;
6178 }
6179
6180 switch(target)
6181 {
6182 case GL_TEXTURE_3D:
6183 {
6184 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006185 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006186 }
6187 break;
6188
6189 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006190 {
6191 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006192 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006193 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006194 break;
6195
6196 default:
6197 return gl::error(GL_INVALID_ENUM);
6198 }
6199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006200 }
6201 catch(std::bad_alloc&)
6202 {
6203 return gl::error(GL_OUT_OF_MEMORY);
6204 }
6205}
6206
6207void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6208{
6209 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6210 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6211 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6212
6213 try
6214 {
6215 gl::Context *context = gl::getNonLostContext();
6216
6217 if (context)
6218 {
6219 if (context->getClientVersion() < 3)
6220 {
6221 return gl::error(GL_INVALID_OPERATION);
6222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006223
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006224 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006225 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006226 {
6227 return;
6228 }
6229
6230 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6231 gl::Texture *texture = NULL;
6232 switch (target)
6233 {
6234 case GL_TEXTURE_3D:
6235 texture = context->getTexture3D();
6236 break;
6237
6238 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006239 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006240 break;
6241
6242 default:
6243 return gl::error(GL_INVALID_ENUM);
6244 }
6245
6246 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006248 }
6249 catch(std::bad_alloc&)
6250 {
6251 return gl::error(GL_OUT_OF_MEMORY);
6252 }
6253}
6254
6255void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6256{
Geoff Langeef52cc2013-10-16 15:07:39 -04006257 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006258 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6259 "const GLvoid* data = 0x%0.8p)",
6260 target, level, internalformat, width, height, depth, border, imageSize, data);
6261
6262 try
6263 {
6264 gl::Context *context = gl::getNonLostContext();
6265
6266 if (context)
6267 {
6268 if (context->getClientVersion() < 3)
6269 {
6270 return gl::error(GL_INVALID_OPERATION);
6271 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006272
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006273 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006274 {
6275 return gl::error(GL_INVALID_VALUE);
6276 }
6277
6278 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006279 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006280 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006281 {
6282 return;
6283 }
6284
6285 switch(target)
6286 {
6287 case GL_TEXTURE_3D:
6288 {
6289 gl::Texture3D *texture = context->getTexture3D();
6290 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6291 }
6292 break;
6293
6294 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006295 {
6296 gl::Texture2DArray *texture = context->getTexture2DArray();
6297 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6298 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006299 break;
6300
6301 default:
6302 return gl::error(GL_INVALID_ENUM);
6303 }
6304 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006305 }
6306 catch(std::bad_alloc&)
6307 {
6308 return gl::error(GL_OUT_OF_MEMORY);
6309 }
6310}
6311
6312void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
6313{
6314 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6315 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6316 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6317 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6318
6319 try
6320 {
6321 gl::Context *context = gl::getNonLostContext();
6322
6323 if (context)
6324 {
6325 if (context->getClientVersion() < 3)
6326 {
6327 return gl::error(GL_INVALID_OPERATION);
6328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006329
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006330 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006331 {
6332 return gl::error(GL_INVALID_VALUE);
6333 }
6334
6335 if (!data)
6336 {
6337 return gl::error(GL_INVALID_VALUE);
6338 }
6339
6340 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006341 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006342 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006343 {
6344 return;
6345 }
6346
6347 switch(target)
6348 {
6349 case GL_TEXTURE_3D:
6350 {
6351 gl::Texture3D *texture = context->getTexture3D();
6352 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6353 format, imageSize, data);
6354 }
6355 break;
6356
6357 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006358 {
6359 gl::Texture2DArray *texture = context->getTexture2DArray();
6360 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6361 format, imageSize, data);
6362 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006363 break;
6364
6365 default:
6366 return gl::error(GL_INVALID_ENUM);
6367 }
6368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006369 }
6370 catch(std::bad_alloc&)
6371 {
6372 return gl::error(GL_OUT_OF_MEMORY);
6373 }
6374}
6375
6376void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6377{
6378 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6379
6380 try
6381 {
6382 gl::Context *context = gl::getNonLostContext();
6383
6384 if (context)
6385 {
6386 if (context->getClientVersion() < 3)
6387 {
6388 return gl::error(GL_INVALID_OPERATION);
6389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006390
Geoff Lang37dde692014-01-31 16:34:54 -05006391 if (n < 0)
6392 {
6393 return gl::error(GL_INVALID_VALUE);
6394 }
6395
6396 for (GLsizei i = 0; i < n; i++)
6397 {
6398 ids[i] = context->createQuery();
6399 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006401 }
6402 catch(std::bad_alloc&)
6403 {
6404 return gl::error(GL_OUT_OF_MEMORY);
6405 }
6406}
6407
6408void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6409{
6410 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6411
6412 try
6413 {
6414 gl::Context *context = gl::getNonLostContext();
6415
6416 if (context)
6417 {
6418 if (context->getClientVersion() < 3)
6419 {
6420 return gl::error(GL_INVALID_OPERATION);
6421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006422
Geoff Lang37dde692014-01-31 16:34:54 -05006423 if (n < 0)
6424 {
6425 return gl::error(GL_INVALID_VALUE);
6426 }
6427
6428 for (GLsizei i = 0; i < n; i++)
6429 {
6430 context->deleteQuery(ids[i]);
6431 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006433 }
6434 catch(std::bad_alloc&)
6435 {
6436 return gl::error(GL_OUT_OF_MEMORY);
6437 }
6438}
6439
6440GLboolean __stdcall glIsQuery(GLuint id)
6441{
6442 EVENT("(GLuint id = %u)", id);
6443
6444 try
6445 {
6446 gl::Context *context = gl::getNonLostContext();
6447
6448 if (context)
6449 {
6450 if (context->getClientVersion() < 3)
6451 {
6452 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006454
Geoff Lang37dde692014-01-31 16:34:54 -05006455 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006457 }
6458 catch(std::bad_alloc&)
6459 {
6460 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6461 }
6462
6463 return GL_FALSE;
6464}
6465
6466void __stdcall glBeginQuery(GLenum target, GLuint id)
6467{
6468 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6469
6470 try
6471 {
6472 gl::Context *context = gl::getNonLostContext();
6473
6474 if (context)
6475 {
6476 if (context->getClientVersion() < 3)
6477 {
6478 return gl::error(GL_INVALID_OPERATION);
6479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480
Geoff Lang37dde692014-01-31 16:34:54 -05006481 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006482 {
Geoff Lang37dde692014-01-31 16:34:54 -05006483 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006484 }
6485
6486 if (id == 0)
6487 {
6488 return gl::error(GL_INVALID_OPERATION);
6489 }
6490
Geoff Lang37dde692014-01-31 16:34:54 -05006491 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006493 }
6494 catch(std::bad_alloc&)
6495 {
6496 return gl::error(GL_OUT_OF_MEMORY);
6497 }
6498}
6499
6500void __stdcall glEndQuery(GLenum target)
6501{
6502 EVENT("(GLenum target = 0x%X)", target);
6503
6504 try
6505 {
6506 gl::Context *context = gl::getNonLostContext();
6507
6508 if (context)
6509 {
6510 if (context->getClientVersion() < 3)
6511 {
6512 return gl::error(GL_INVALID_OPERATION);
6513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006514
Geoff Lang37dde692014-01-31 16:34:54 -05006515 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006516 {
Geoff Lang37dde692014-01-31 16:34:54 -05006517 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006518 }
Geoff Lang37dde692014-01-31 16:34:54 -05006519
6520 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522 }
6523 catch(std::bad_alloc&)
6524 {
6525 return gl::error(GL_OUT_OF_MEMORY);
6526 }
6527}
6528
6529void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6530{
6531 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6532
6533 try
6534 {
6535 gl::Context *context = gl::getNonLostContext();
6536
6537 if (context)
6538 {
6539 if (context->getClientVersion() < 3)
6540 {
6541 return gl::error(GL_INVALID_OPERATION);
6542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006543
Geoff Lang37dde692014-01-31 16:34:54 -05006544 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006545 {
Geoff Lang37dde692014-01-31 16:34:54 -05006546 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006547 }
Geoff Lang37dde692014-01-31 16:34:54 -05006548
6549 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006550 {
Geoff Lang37dde692014-01-31 16:34:54 -05006551 case GL_CURRENT_QUERY:
6552 params[0] = context->getActiveQuery(target);
6553 break;
6554
6555 default:
6556 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006557 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006559 }
6560 catch(std::bad_alloc&)
6561 {
6562 return gl::error(GL_OUT_OF_MEMORY);
6563 }
6564}
6565
6566void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6567{
6568 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6569
6570 try
6571 {
6572 gl::Context *context = gl::getNonLostContext();
6573
6574 if (context)
6575 {
6576 if (context->getClientVersion() < 3)
6577 {
6578 return gl::error(GL_INVALID_OPERATION);
6579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580
Geoff Lang37dde692014-01-31 16:34:54 -05006581 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6582
6583 if (!queryObject)
6584 {
6585 return gl::error(GL_INVALID_OPERATION);
6586 }
6587
6588 if (context->getActiveQuery(queryObject->getType()) == id)
6589 {
6590 return gl::error(GL_INVALID_OPERATION);
6591 }
6592
6593 switch(pname)
6594 {
6595 case GL_QUERY_RESULT:
6596 params[0] = queryObject->getResult();
6597 break;
6598 case GL_QUERY_RESULT_AVAILABLE:
6599 params[0] = queryObject->isResultAvailable();
6600 break;
6601 default:
6602 return gl::error(GL_INVALID_ENUM);
6603 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006604 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006605 }
6606 catch(std::bad_alloc&)
6607 {
6608 return gl::error(GL_OUT_OF_MEMORY);
6609 }
6610}
6611
6612GLboolean __stdcall glUnmapBuffer(GLenum target)
6613{
6614 EVENT("(GLenum target = 0x%X)", target);
6615
6616 try
6617 {
6618 gl::Context *context = gl::getNonLostContext();
6619
6620 if (context)
6621 {
6622 if (context->getClientVersion() < 3)
6623 {
6624 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006626
Shannon Woodsb3801742014-03-27 14:59:19 -04006627 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006628 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006629 }
6630 catch(std::bad_alloc&)
6631 {
6632 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6633 }
6634
6635 return GL_FALSE;
6636}
6637
6638void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6639{
6640 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6641
6642 try
6643 {
6644 gl::Context *context = gl::getNonLostContext();
6645
6646 if (context)
6647 {
6648 if (context->getClientVersion() < 3)
6649 {
6650 return gl::error(GL_INVALID_OPERATION);
6651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652
Shannon Woodsb3801742014-03-27 14:59:19 -04006653 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655 }
6656 catch(std::bad_alloc&)
6657 {
6658 return gl::error(GL_OUT_OF_MEMORY);
6659 }
6660}
6661
6662void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6663{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006664 try
6665 {
6666 gl::Context *context = gl::getNonLostContext();
6667
6668 if (context)
6669 {
6670 if (context->getClientVersion() < 3)
6671 {
6672 return gl::error(GL_INVALID_OPERATION);
6673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006674
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006675 glDrawBuffersEXT(n, bufs);
6676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006677 }
6678 catch(std::bad_alloc&)
6679 {
6680 return gl::error(GL_OUT_OF_MEMORY);
6681 }
6682}
6683
6684void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6685{
6686 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6687 location, count, transpose, value);
6688
6689 try
6690 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006691 if (count < 0)
6692 {
6693 return gl::error(GL_INVALID_VALUE);
6694 }
6695
6696 if (location == -1)
6697 {
6698 return;
6699 }
6700
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006701 gl::Context *context = gl::getNonLostContext();
6702
6703 if (context)
6704 {
6705 if (context->getClientVersion() < 3)
6706 {
6707 return gl::error(GL_INVALID_OPERATION);
6708 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006709
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006710 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6711 if (!programBinary)
6712 {
6713 return gl::error(GL_INVALID_OPERATION);
6714 }
6715
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006716 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006717 {
6718 return gl::error(GL_INVALID_OPERATION);
6719 }
6720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006721 }
6722 catch(std::bad_alloc&)
6723 {
6724 return gl::error(GL_OUT_OF_MEMORY);
6725 }
6726}
6727
6728void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6729{
6730 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6731 location, count, transpose, value);
6732
6733 try
6734 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006735 if (count < 0)
6736 {
6737 return gl::error(GL_INVALID_VALUE);
6738 }
6739
6740 if (location == -1)
6741 {
6742 return;
6743 }
6744
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006745 gl::Context *context = gl::getNonLostContext();
6746
6747 if (context)
6748 {
6749 if (context->getClientVersion() < 3)
6750 {
6751 return gl::error(GL_INVALID_OPERATION);
6752 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006753
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006754 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6755 if (!programBinary)
6756 {
6757 return gl::error(GL_INVALID_OPERATION);
6758 }
6759
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006760 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006761 {
6762 return gl::error(GL_INVALID_OPERATION);
6763 }
6764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006765 }
6766 catch(std::bad_alloc&)
6767 {
6768 return gl::error(GL_OUT_OF_MEMORY);
6769 }
6770}
6771
6772void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6773{
6774 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6775 location, count, transpose, value);
6776
6777 try
6778 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006779 if (count < 0)
6780 {
6781 return gl::error(GL_INVALID_VALUE);
6782 }
6783
6784 if (location == -1)
6785 {
6786 return;
6787 }
6788
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789 gl::Context *context = gl::getNonLostContext();
6790
6791 if (context)
6792 {
6793 if (context->getClientVersion() < 3)
6794 {
6795 return gl::error(GL_INVALID_OPERATION);
6796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006797
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006798 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6799 if (!programBinary)
6800 {
6801 return gl::error(GL_INVALID_OPERATION);
6802 }
6803
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006804 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006805 {
6806 return gl::error(GL_INVALID_OPERATION);
6807 }
6808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006809 }
6810 catch(std::bad_alloc&)
6811 {
6812 return gl::error(GL_OUT_OF_MEMORY);
6813 }
6814}
6815
6816void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6817{
6818 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6819 location, count, transpose, value);
6820
6821 try
6822 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006823 if (count < 0)
6824 {
6825 return gl::error(GL_INVALID_VALUE);
6826 }
6827
6828 if (location == -1)
6829 {
6830 return;
6831 }
6832
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006833 gl::Context *context = gl::getNonLostContext();
6834
6835 if (context)
6836 {
6837 if (context->getClientVersion() < 3)
6838 {
6839 return gl::error(GL_INVALID_OPERATION);
6840 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006841
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006842 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6843 if (!programBinary)
6844 {
6845 return gl::error(GL_INVALID_OPERATION);
6846 }
6847
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006848 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006849 {
6850 return gl::error(GL_INVALID_OPERATION);
6851 }
6852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006853 }
6854 catch(std::bad_alloc&)
6855 {
6856 return gl::error(GL_OUT_OF_MEMORY);
6857 }
6858}
6859
6860void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6861{
6862 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6863 location, count, transpose, value);
6864
6865 try
6866 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006867 if (count < 0)
6868 {
6869 return gl::error(GL_INVALID_VALUE);
6870 }
6871
6872 if (location == -1)
6873 {
6874 return;
6875 }
6876
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006877 gl::Context *context = gl::getNonLostContext();
6878
6879 if (context)
6880 {
6881 if (context->getClientVersion() < 3)
6882 {
6883 return gl::error(GL_INVALID_OPERATION);
6884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006885
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006886 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6887 if (!programBinary)
6888 {
6889 return gl::error(GL_INVALID_OPERATION);
6890 }
6891
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006892 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006893 {
6894 return gl::error(GL_INVALID_OPERATION);
6895 }
6896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006897 }
6898 catch(std::bad_alloc&)
6899 {
6900 return gl::error(GL_OUT_OF_MEMORY);
6901 }
6902}
6903
6904void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6905{
6906 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6907 location, count, transpose, value);
6908
6909 try
6910 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006911 if (count < 0)
6912 {
6913 return gl::error(GL_INVALID_VALUE);
6914 }
6915
6916 if (location == -1)
6917 {
6918 return;
6919 }
6920
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921 gl::Context *context = gl::getNonLostContext();
6922
6923 if (context)
6924 {
6925 if (context->getClientVersion() < 3)
6926 {
6927 return gl::error(GL_INVALID_OPERATION);
6928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006929
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006930 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6931 if (!programBinary)
6932 {
6933 return gl::error(GL_INVALID_OPERATION);
6934 }
6935
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006936 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006937 {
6938 return gl::error(GL_INVALID_OPERATION);
6939 }
6940 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006941 }
6942 catch(std::bad_alloc&)
6943 {
6944 return gl::error(GL_OUT_OF_MEMORY);
6945 }
6946}
6947
6948void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6949{
6950 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6951 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6952 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6953
6954 try
6955 {
6956 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006957 if (context)
6958 {
6959 if (context->getClientVersion() < 3)
6960 {
6961 return gl::error(GL_INVALID_OPERATION);
6962 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006963
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006964 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006965 dstX0, dstY0, dstX1, dstY1, mask, filter,
6966 false))
6967 {
6968 return;
6969 }
6970
6971 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6972 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006974 }
6975 catch(std::bad_alloc&)
6976 {
6977 return gl::error(GL_OUT_OF_MEMORY);
6978 }
6979}
6980
6981void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6982{
6983 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6984 target, samples, internalformat, width, height);
6985
6986 try
6987 {
6988 gl::Context *context = gl::getNonLostContext();
6989
6990 if (context)
6991 {
6992 if (context->getClientVersion() < 3)
6993 {
6994 return gl::error(GL_INVALID_OPERATION);
6995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006996
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006997 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006998 width, height, false))
6999 {
7000 return;
7001 }
7002
7003 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007005 }
7006 catch(std::bad_alloc&)
7007 {
7008 return gl::error(GL_OUT_OF_MEMORY);
7009 }
7010}
7011
7012void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7013{
7014 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7015 target, attachment, texture, level, layer);
7016
7017 try
7018 {
7019 gl::Context *context = gl::getNonLostContext();
7020
7021 if (context)
7022 {
7023 if (context->getClientVersion() < 3)
7024 {
7025 return gl::error(GL_INVALID_OPERATION);
7026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007027
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007028 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007029 {
7030 return;
7031 }
7032
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007033 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7034 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007035
7036 gl::Texture *textureObject = context->getTexture(texture);
7037 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7038
7039 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7040 {
7041 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7042 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7043 }
7044 else
7045 {
7046 switch (attachment)
7047 {
7048 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7049 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7050 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7051 }
7052 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007053 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007054 }
7055 catch(std::bad_alloc&)
7056 {
7057 return gl::error(GL_OUT_OF_MEMORY);
7058 }
7059}
7060
7061GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7062{
7063 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7064 target, offset, length, access);
7065
7066 try
7067 {
7068 gl::Context *context = gl::getNonLostContext();
7069
7070 if (context)
7071 {
7072 if (context->getClientVersion() < 3)
7073 {
7074 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076
Jamie Madill7a5f7382014-03-05 15:01:24 -05007077 if (!gl::ValidBufferTarget(context, target))
7078 {
7079 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
7080 }
7081
7082 if (offset < 0 || length < 0)
7083 {
7084 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7085 }
7086
7087 gl::Buffer *buffer = context->getTargetBuffer(target);
7088
7089 if (buffer == NULL)
7090 {
7091 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7092 }
7093
7094 // Check for buffer overflow
7095 size_t offsetSize = static_cast<size_t>(offset);
7096 size_t lengthSize = static_cast<size_t>(length);
7097
7098 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7099 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
7100 {
7101 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7102 }
7103
7104 // Check for invalid bits in the mask
7105 GLbitfield allAccessBits = GL_MAP_READ_BIT |
7106 GL_MAP_WRITE_BIT |
7107 GL_MAP_INVALIDATE_RANGE_BIT |
7108 GL_MAP_INVALIDATE_BUFFER_BIT |
7109 GL_MAP_FLUSH_EXPLICIT_BIT |
7110 GL_MAP_UNSYNCHRONIZED_BIT;
7111
7112 if (access & ~(allAccessBits))
7113 {
7114 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7115 }
7116
7117 if (length == 0 || buffer->mapped())
7118 {
7119 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7120 }
7121
7122 // Check for invalid bit combinations
7123 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
7124 {
7125 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7126 }
7127
7128 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
7129 GL_MAP_INVALIDATE_BUFFER_BIT |
7130 GL_MAP_UNSYNCHRONIZED_BIT;
7131
7132 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
7133 {
7134 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7135 }
7136
7137 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
7138 {
7139 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7140 }
7141
7142 return buffer->mapRange(offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007144 }
7145 catch(std::bad_alloc&)
7146 {
7147 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7148 }
7149
7150 return NULL;
7151}
7152
7153void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7154{
7155 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7156
7157 try
7158 {
7159 gl::Context *context = gl::getNonLostContext();
7160
7161 if (context)
7162 {
7163 if (context->getClientVersion() < 3)
7164 {
7165 return gl::error(GL_INVALID_OPERATION);
7166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167
Jamie Madill7a5f7382014-03-05 15:01:24 -05007168 if (offset < 0 || length < 0)
7169 {
7170 return gl::error(GL_INVALID_VALUE);
7171 }
7172
7173 if (!gl::ValidBufferTarget(context, target))
7174 {
7175 return gl::error(GL_INVALID_ENUM);
7176 }
7177
7178 gl::Buffer *buffer = context->getTargetBuffer(target);
7179
7180 if (buffer == NULL)
7181 {
7182 return gl::error(GL_INVALID_OPERATION);
7183 }
7184
7185 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
7186 {
7187 return gl::error(GL_INVALID_OPERATION);
7188 }
7189
7190 // Check for buffer overflow
7191 size_t offsetSize = static_cast<size_t>(offset);
7192 size_t lengthSize = static_cast<size_t>(length);
7193
7194 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7195 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
7196 {
7197 return gl::error(GL_INVALID_VALUE);
7198 }
7199
7200 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007202 }
7203 catch(std::bad_alloc&)
7204 {
7205 return gl::error(GL_OUT_OF_MEMORY);
7206 }
7207}
7208
7209void __stdcall glBindVertexArray(GLuint array)
7210{
7211 EVENT("(GLuint array = %u)", array);
7212
7213 try
7214 {
7215 gl::Context *context = gl::getNonLostContext();
7216
7217 if (context)
7218 {
7219 if (context->getClientVersion() < 3)
7220 {
7221 return gl::error(GL_INVALID_OPERATION);
7222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007223
Jamie Madilld1028542013-07-02 11:57:04 -04007224 gl::VertexArray *vao = context->getVertexArray(array);
7225
7226 if (!vao)
7227 {
7228 // The default VAO should always exist
7229 ASSERT(array != 0);
7230 return gl::error(GL_INVALID_OPERATION);
7231 }
7232
7233 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007234 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007235 }
7236 catch(std::bad_alloc&)
7237 {
7238 return gl::error(GL_OUT_OF_MEMORY);
7239 }
7240}
7241
7242void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7243{
7244 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7245
7246 try
7247 {
7248 gl::Context *context = gl::getNonLostContext();
7249
7250 if (context)
7251 {
7252 if (context->getClientVersion() < 3)
7253 {
7254 return gl::error(GL_INVALID_OPERATION);
7255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007256
Jamie Madilld1028542013-07-02 11:57:04 -04007257 if (n < 0)
7258 {
7259 return gl::error(GL_INVALID_VALUE);
7260 }
7261
7262 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7263 {
7264 if (arrays[arrayIndex] != 0)
7265 {
7266 context->deleteVertexArray(arrays[arrayIndex]);
7267 }
7268 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007270 }
7271 catch(std::bad_alloc&)
7272 {
7273 return gl::error(GL_OUT_OF_MEMORY);
7274 }
7275}
7276
7277void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7278{
7279 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7280
7281 try
7282 {
7283 gl::Context *context = gl::getNonLostContext();
7284
7285 if (context)
7286 {
7287 if (context->getClientVersion() < 3)
7288 {
7289 return gl::error(GL_INVALID_OPERATION);
7290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007291
Jamie Madilld1028542013-07-02 11:57:04 -04007292 if (n < 0)
7293 {
7294 return gl::error(GL_INVALID_VALUE);
7295 }
7296
7297 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7298 {
7299 arrays[arrayIndex] = context->createVertexArray();
7300 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007302 }
7303 catch(std::bad_alloc&)
7304 {
7305 return gl::error(GL_OUT_OF_MEMORY);
7306 }
7307}
7308
7309GLboolean __stdcall glIsVertexArray(GLuint array)
7310{
7311 EVENT("(GLuint array = %u)", array);
7312
7313 try
7314 {
7315 gl::Context *context = gl::getNonLostContext();
7316
7317 if (context)
7318 {
7319 if (context->getClientVersion() < 3)
7320 {
7321 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7322 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007323
Jamie Madilld1028542013-07-02 11:57:04 -04007324 if (array == 0)
7325 {
7326 return GL_FALSE;
7327 }
7328
7329 gl::VertexArray *vao = context->getVertexArray(array);
7330
7331 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007332 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007333 }
7334 catch(std::bad_alloc&)
7335 {
7336 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7337 }
7338
7339 return GL_FALSE;
7340}
7341
7342void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7343{
7344 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7345 target, index, data);
7346
7347 try
7348 {
7349 gl::Context *context = gl::getNonLostContext();
7350
7351 if (context)
7352 {
7353 if (context->getClientVersion() < 3)
7354 {
7355 return gl::error(GL_INVALID_OPERATION);
7356 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007357
Shannon Woods15934d52013-08-19 14:28:49 -04007358 switch (target)
7359 {
7360 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7361 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7362 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7363 if (index >= context->getMaxTransformFeedbackBufferBindings())
7364 return gl::error(GL_INVALID_VALUE);
7365 break;
7366 case GL_UNIFORM_BUFFER_START:
7367 case GL_UNIFORM_BUFFER_SIZE:
7368 case GL_UNIFORM_BUFFER_BINDING:
7369 if (index >= context->getMaximumCombinedUniformBufferBindings())
7370 return gl::error(GL_INVALID_VALUE);
7371 break;
7372 default:
7373 return gl::error(GL_INVALID_ENUM);
7374 }
7375
7376 if (!(context->getIndexedIntegerv(target, index, data)))
7377 {
7378 GLenum nativeType;
7379 unsigned int numParams = 0;
7380 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7381 return gl::error(GL_INVALID_ENUM);
7382
7383 if (numParams == 0)
7384 return; // it is known that pname is valid, but there are no parameters to return
7385
7386 if (nativeType == GL_INT_64_ANGLEX)
7387 {
7388 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7389 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7390 GLint64 *int64Params = new GLint64[numParams];
7391
7392 context->getIndexedInteger64v(target, index, int64Params);
7393
7394 for (unsigned int i = 0; i < numParams; ++i)
7395 {
7396 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7397 data[i] = static_cast<GLint>(clampedValue);
7398 }
7399
7400 delete [] int64Params;
7401 }
7402 else
7403 {
7404 UNREACHABLE();
7405 }
7406 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007407 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007408 }
7409 catch(std::bad_alloc&)
7410 {
7411 return gl::error(GL_OUT_OF_MEMORY);
7412 }
7413}
7414
7415void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7416{
7417 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7418
7419 try
7420 {
7421 gl::Context *context = gl::getNonLostContext();
7422
7423 if (context)
7424 {
7425 if (context->getClientVersion() < 3)
7426 {
7427 return gl::error(GL_INVALID_OPERATION);
7428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007429
Geoff Langc8058452014-02-03 12:04:11 -05007430 switch (primitiveMode)
7431 {
7432 case GL_TRIANGLES:
7433 case GL_LINES:
7434 case GL_POINTS:
7435 break;
7436 default:
7437 return gl::error(GL_INVALID_ENUM);
7438 }
7439
7440 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7441 ASSERT(transformFeedback != NULL);
7442
7443 if (transformFeedback->isStarted())
7444 {
7445 return gl::error(GL_INVALID_OPERATION);
7446 }
7447
7448 if (transformFeedback->isPaused())
7449 {
7450 transformFeedback->resume();
7451 }
7452 else
7453 {
7454 transformFeedback->start(primitiveMode);
7455 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007457 }
7458 catch(std::bad_alloc&)
7459 {
7460 return gl::error(GL_OUT_OF_MEMORY);
7461 }
7462}
7463
7464void __stdcall glEndTransformFeedback(void)
7465{
7466 EVENT("(void)");
7467
7468 try
7469 {
7470 gl::Context *context = gl::getNonLostContext();
7471
7472 if (context)
7473 {
7474 if (context->getClientVersion() < 3)
7475 {
7476 return gl::error(GL_INVALID_OPERATION);
7477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007478
Geoff Langc8058452014-02-03 12:04:11 -05007479 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7480 ASSERT(transformFeedback != NULL);
7481
7482 if (!transformFeedback->isStarted())
7483 {
7484 return gl::error(GL_INVALID_OPERATION);
7485 }
7486
7487 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007489 }
7490 catch(std::bad_alloc&)
7491 {
7492 return gl::error(GL_OUT_OF_MEMORY);
7493 }
7494}
7495
7496void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7497{
7498 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7499 target, index, buffer, offset, size);
7500
7501 try
7502 {
7503 gl::Context *context = gl::getNonLostContext();
7504
7505 if (context)
7506 {
7507 if (context->getClientVersion() < 3)
7508 {
7509 return gl::error(GL_INVALID_OPERATION);
7510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007511
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007512 switch (target)
7513 {
7514 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007515 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007516 {
7517 return gl::error(GL_INVALID_VALUE);
7518 }
7519 break;
7520
7521 case GL_UNIFORM_BUFFER:
7522 if (index >= context->getMaximumCombinedUniformBufferBindings())
7523 {
7524 return gl::error(GL_INVALID_VALUE);
7525 }
7526 break;
7527
7528 default:
7529 return gl::error(GL_INVALID_ENUM);
7530 }
7531
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007532 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007533 {
7534 return gl::error(GL_INVALID_VALUE);
7535 }
7536
7537 switch (target)
7538 {
7539 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007540
7541 // size and offset must be a multiple of 4
7542 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7543 {
7544 return gl::error(GL_INVALID_VALUE);
7545 }
7546
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007547 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7548 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007549 break;
7550
7551 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007552
7553 // it is an error to bind an offset not a multiple of the alignment
7554 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7555 {
7556 return gl::error(GL_INVALID_VALUE);
7557 }
7558
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007559 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7560 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007561 break;
7562
7563 default:
7564 UNREACHABLE();
7565 }
7566 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007567 }
7568 catch(std::bad_alloc&)
7569 {
7570 return gl::error(GL_OUT_OF_MEMORY);
7571 }
7572}
7573
7574void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7575{
7576 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7577 target, index, buffer);
7578
7579 try
7580 {
7581 gl::Context *context = gl::getNonLostContext();
7582
7583 if (context)
7584 {
7585 if (context->getClientVersion() < 3)
7586 {
7587 return gl::error(GL_INVALID_OPERATION);
7588 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007589
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007590 switch (target)
7591 {
7592 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007593 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007594 {
7595 return gl::error(GL_INVALID_VALUE);
7596 }
7597 break;
7598
7599 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007600 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007601 {
7602 return gl::error(GL_INVALID_VALUE);
7603 }
7604 break;
7605
7606 default:
7607 return gl::error(GL_INVALID_ENUM);
7608 }
7609
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007610 switch (target)
7611 {
7612 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007613 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007614 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007615 break;
7616
7617 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007618 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007619 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007620 break;
7621
7622 default:
7623 UNREACHABLE();
7624 }
7625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007626 }
7627 catch(std::bad_alloc&)
7628 {
7629 return gl::error(GL_OUT_OF_MEMORY);
7630 }
7631}
7632
7633void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7634{
7635 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7636 program, count, varyings, bufferMode);
7637
7638 try
7639 {
7640 gl::Context *context = gl::getNonLostContext();
7641
7642 if (context)
7643 {
7644 if (context->getClientVersion() < 3)
7645 {
7646 return gl::error(GL_INVALID_OPERATION);
7647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007648
Geoff Lang48dcae72014-02-05 16:28:24 -05007649 if (count < 0)
7650 {
7651 return gl::error(GL_INVALID_VALUE);
7652 }
7653
7654 switch (bufferMode)
7655 {
7656 case GL_INTERLEAVED_ATTRIBS:
7657 break;
7658 case GL_SEPARATE_ATTRIBS:
7659 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7660 {
7661 return gl::error(GL_INVALID_VALUE);
7662 }
7663 break;
7664 default:
7665 return gl::error(GL_INVALID_ENUM);
7666 }
7667
7668 if (!gl::ValidProgram(context, program))
7669 {
7670 return;
7671 }
7672
7673 gl::Program *programObject = context->getProgram(program);
7674 ASSERT(programObject);
7675
7676 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007678 }
7679 catch(std::bad_alloc&)
7680 {
7681 return gl::error(GL_OUT_OF_MEMORY);
7682 }
7683}
7684
7685void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7686{
7687 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7688 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7689 program, index, bufSize, length, size, type, name);
7690
7691 try
7692 {
7693 gl::Context *context = gl::getNonLostContext();
7694
7695 if (context)
7696 {
7697 if (context->getClientVersion() < 3)
7698 {
7699 return gl::error(GL_INVALID_OPERATION);
7700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007701
Geoff Lang48dcae72014-02-05 16:28:24 -05007702 if (bufSize < 0)
7703 {
7704 return gl::error(GL_INVALID_VALUE);
7705 }
7706
7707 if (!gl::ValidProgram(context, program))
7708 {
7709 return;
7710 }
7711
7712 gl::Program *programObject = context->getProgram(program);
7713 ASSERT(programObject);
7714
7715 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7716 {
7717 return gl::error(GL_INVALID_VALUE);
7718 }
7719
7720 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007721 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007722 }
7723 catch(std::bad_alloc&)
7724 {
7725 return gl::error(GL_OUT_OF_MEMORY);
7726 }
7727}
7728
7729void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7730{
7731 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7732 index, size, type, stride, pointer);
7733
7734 try
7735 {
7736 gl::Context *context = gl::getNonLostContext();
7737
7738 if (context)
7739 {
7740 if (context->getClientVersion() < 3)
7741 {
7742 return gl::error(GL_INVALID_OPERATION);
7743 }
7744 }
7745
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007746 if (index >= gl::MAX_VERTEX_ATTRIBS)
7747 {
7748 return gl::error(GL_INVALID_VALUE);
7749 }
7750
7751 if (size < 1 || size > 4)
7752 {
7753 return gl::error(GL_INVALID_VALUE);
7754 }
7755
7756 switch (type)
7757 {
7758 case GL_BYTE:
7759 case GL_UNSIGNED_BYTE:
7760 case GL_SHORT:
7761 case GL_UNSIGNED_SHORT:
7762 case GL_INT:
7763 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007764 case GL_INT_2_10_10_10_REV:
7765 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007766 break;
7767 default:
7768 return gl::error(GL_INVALID_ENUM);
7769 }
7770
7771 if (stride < 0)
7772 {
7773 return gl::error(GL_INVALID_VALUE);
7774 }
7775
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007776 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7777 {
7778 return gl::error(GL_INVALID_OPERATION);
7779 }
7780
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007781 if (context)
7782 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007783 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7784 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7785 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7786 // and the pointer argument is not NULL.
7787 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7788 {
7789 return gl::error(GL_INVALID_OPERATION);
7790 }
7791
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007792 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7793 stride, pointer);
7794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007795 }
7796 catch(std::bad_alloc&)
7797 {
7798 return gl::error(GL_OUT_OF_MEMORY);
7799 }
7800}
7801
7802void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7803{
7804 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7805 index, pname, params);
7806
7807 try
7808 {
7809 gl::Context *context = gl::getNonLostContext();
7810
7811 if (context)
7812 {
7813 if (context->getClientVersion() < 3)
7814 {
7815 return gl::error(GL_INVALID_OPERATION);
7816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007817
Jamie Madilla7d05862013-07-02 11:57:06 -04007818 if (index >= gl::MAX_VERTEX_ATTRIBS)
7819 {
7820 return gl::error(GL_INVALID_VALUE);
7821 }
7822
7823 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7824
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007825 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007826 {
7827 return;
7828 }
7829
7830 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7831 {
7832 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7833 for (int i = 0; i < 4; ++i)
7834 {
7835 params[i] = currentValueData.IntValues[i];
7836 }
7837 }
7838 else
7839 {
7840 *params = attribState.querySingleParameter<GLint>(pname);
7841 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007842 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007843 }
7844 catch(std::bad_alloc&)
7845 {
7846 return gl::error(GL_OUT_OF_MEMORY);
7847 }
7848}
7849
7850void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7851{
7852 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7853 index, pname, params);
7854
7855 try
7856 {
7857 gl::Context *context = gl::getNonLostContext();
7858
7859 if (context)
7860 {
7861 if (context->getClientVersion() < 3)
7862 {
7863 return gl::error(GL_INVALID_OPERATION);
7864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007865
Jamie Madilla7d05862013-07-02 11:57:06 -04007866 if (index >= gl::MAX_VERTEX_ATTRIBS)
7867 {
7868 return gl::error(GL_INVALID_VALUE);
7869 }
7870
7871 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7872
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007873 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007874 {
7875 return;
7876 }
7877
7878 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7879 {
7880 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7881 for (int i = 0; i < 4; ++i)
7882 {
7883 params[i] = currentValueData.UnsignedIntValues[i];
7884 }
7885 }
7886 else
7887 {
7888 *params = attribState.querySingleParameter<GLuint>(pname);
7889 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007891 }
7892 catch(std::bad_alloc&)
7893 {
7894 return gl::error(GL_OUT_OF_MEMORY);
7895 }
7896}
7897
7898void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7899{
7900 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7901 index, x, y, z, w);
7902
7903 try
7904 {
7905 gl::Context *context = gl::getNonLostContext();
7906
7907 if (context)
7908 {
7909 if (context->getClientVersion() < 3)
7910 {
7911 return gl::error(GL_INVALID_OPERATION);
7912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007913
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007914 if (index >= gl::MAX_VERTEX_ATTRIBS)
7915 {
7916 return gl::error(GL_INVALID_VALUE);
7917 }
7918
7919 GLint vals[4] = { x, y, z, w };
7920 context->setVertexAttribi(index, vals);
7921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007922 }
7923 catch(std::bad_alloc&)
7924 {
7925 return gl::error(GL_OUT_OF_MEMORY);
7926 }
7927}
7928
7929void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7930{
7931 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7932 index, x, y, z, w);
7933
7934 try
7935 {
7936 gl::Context *context = gl::getNonLostContext();
7937
7938 if (context)
7939 {
7940 if (context->getClientVersion() < 3)
7941 {
7942 return gl::error(GL_INVALID_OPERATION);
7943 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007944
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007945 if (index >= gl::MAX_VERTEX_ATTRIBS)
7946 {
7947 return gl::error(GL_INVALID_VALUE);
7948 }
7949
7950 GLuint vals[4] = { x, y, z, w };
7951 context->setVertexAttribu(index, vals);
7952 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007953 }
7954 catch(std::bad_alloc&)
7955 {
7956 return gl::error(GL_OUT_OF_MEMORY);
7957 }
7958}
7959
7960void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7961{
7962 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7963
7964 try
7965 {
7966 gl::Context *context = gl::getNonLostContext();
7967
7968 if (context)
7969 {
7970 if (context->getClientVersion() < 3)
7971 {
7972 return gl::error(GL_INVALID_OPERATION);
7973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007974
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007975 if (index >= gl::MAX_VERTEX_ATTRIBS)
7976 {
7977 return gl::error(GL_INVALID_VALUE);
7978 }
7979
7980 context->setVertexAttribi(index, v);
7981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007982 }
7983 catch(std::bad_alloc&)
7984 {
7985 return gl::error(GL_OUT_OF_MEMORY);
7986 }
7987}
7988
7989void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7990{
7991 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7992
7993 try
7994 {
7995 gl::Context *context = gl::getNonLostContext();
7996
7997 if (context)
7998 {
7999 if (context->getClientVersion() < 3)
8000 {
8001 return gl::error(GL_INVALID_OPERATION);
8002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008003
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008004 if (index >= gl::MAX_VERTEX_ATTRIBS)
8005 {
8006 return gl::error(GL_INVALID_VALUE);
8007 }
8008
8009 context->setVertexAttribu(index, v);
8010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008011 }
8012 catch(std::bad_alloc&)
8013 {
8014 return gl::error(GL_OUT_OF_MEMORY);
8015 }
8016}
8017
8018void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8019{
8020 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8021 program, location, params);
8022
8023 try
8024 {
8025 gl::Context *context = gl::getNonLostContext();
8026
8027 if (context)
8028 {
8029 if (context->getClientVersion() < 3)
8030 {
8031 return gl::error(GL_INVALID_OPERATION);
8032 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008033
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008034 if (program == 0)
8035 {
8036 return gl::error(GL_INVALID_VALUE);
8037 }
8038
8039 gl::Program *programObject = context->getProgram(program);
8040
8041 if (!programObject || !programObject->isLinked())
8042 {
8043 return gl::error(GL_INVALID_OPERATION);
8044 }
8045
8046 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8047 if (!programBinary)
8048 {
8049 return gl::error(GL_INVALID_OPERATION);
8050 }
8051
8052 if (!programBinary->getUniformuiv(location, NULL, params))
8053 {
8054 return gl::error(GL_INVALID_OPERATION);
8055 }
8056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008057 }
8058 catch(std::bad_alloc&)
8059 {
8060 return gl::error(GL_OUT_OF_MEMORY);
8061 }
8062}
8063
8064GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8065{
8066 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8067 program, name);
8068
8069 try
8070 {
8071 gl::Context *context = gl::getNonLostContext();
8072
8073 if (context)
8074 {
8075 if (context->getClientVersion() < 3)
8076 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008077 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008078 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008079
Jamie Madilld1e78c92013-06-20 11:55:50 -04008080 if (program == 0)
8081 {
8082 return gl::error(GL_INVALID_VALUE, -1);
8083 }
8084
8085 gl::Program *programObject = context->getProgram(program);
8086
8087 if (!programObject || !programObject->isLinked())
8088 {
8089 return gl::error(GL_INVALID_OPERATION, -1);
8090 }
8091
8092 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8093 if (!programBinary)
8094 {
8095 return gl::error(GL_INVALID_OPERATION, -1);
8096 }
8097
8098 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008100 }
8101 catch(std::bad_alloc&)
8102 {
8103 return gl::error(GL_OUT_OF_MEMORY, 0);
8104 }
8105
8106 return 0;
8107}
8108
8109void __stdcall glUniform1ui(GLint location, GLuint v0)
8110{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008111 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008112}
8113
8114void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8115{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008116 const GLuint xy[] = { v0, v1 };
8117 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008118}
8119
8120void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8121{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008122 const GLuint xyz[] = { v0, v1, v2 };
8123 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008124}
8125
8126void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8127{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008128 const GLuint xyzw[] = { v0, v1, v2, v3 };
8129 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008130}
8131
8132void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8133{
8134 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8135 location, count, value);
8136
8137 try
8138 {
8139 gl::Context *context = gl::getNonLostContext();
8140
8141 if (context)
8142 {
8143 if (context->getClientVersion() < 3)
8144 {
8145 return gl::error(GL_INVALID_OPERATION);
8146 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008147
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008148 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8149 if (!programBinary)
8150 {
8151 return gl::error(GL_INVALID_OPERATION);
8152 }
8153
8154 if (!programBinary->setUniform1uiv(location, count, value))
8155 {
8156 return gl::error(GL_INVALID_OPERATION);
8157 }
8158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008159 }
8160 catch(std::bad_alloc&)
8161 {
8162 return gl::error(GL_OUT_OF_MEMORY);
8163 }
8164}
8165
8166void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8167{
8168 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8169 location, count, value);
8170
8171 try
8172 {
8173 gl::Context *context = gl::getNonLostContext();
8174
8175 if (context)
8176 {
8177 if (context->getClientVersion() < 3)
8178 {
8179 return gl::error(GL_INVALID_OPERATION);
8180 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008181
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008182 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8183 if (!programBinary)
8184 {
8185 return gl::error(GL_INVALID_OPERATION);
8186 }
8187
8188 if (!programBinary->setUniform2uiv(location, count, value))
8189 {
8190 return gl::error(GL_INVALID_OPERATION);
8191 }
8192 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008193 }
8194 catch(std::bad_alloc&)
8195 {
8196 return gl::error(GL_OUT_OF_MEMORY);
8197 }
8198}
8199
8200void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8201{
8202 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8203 location, count, value);
8204
8205 try
8206 {
8207 gl::Context *context = gl::getNonLostContext();
8208
8209 if (context)
8210 {
8211 if (context->getClientVersion() < 3)
8212 {
8213 return gl::error(GL_INVALID_OPERATION);
8214 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008215
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008216 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8217 if (!programBinary)
8218 {
8219 return gl::error(GL_INVALID_OPERATION);
8220 }
8221
8222 if (!programBinary->setUniform3uiv(location, count, value))
8223 {
8224 return gl::error(GL_INVALID_OPERATION);
8225 }
8226 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008227 }
8228 catch(std::bad_alloc&)
8229 {
8230 return gl::error(GL_OUT_OF_MEMORY);
8231 }
8232}
8233
8234void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8235{
8236 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8237 location, count, value);
8238
8239 try
8240 {
8241 gl::Context *context = gl::getNonLostContext();
8242
8243 if (context)
8244 {
8245 if (context->getClientVersion() < 3)
8246 {
8247 return gl::error(GL_INVALID_OPERATION);
8248 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008249
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008250 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8251 if (!programBinary)
8252 {
8253 return gl::error(GL_INVALID_OPERATION);
8254 }
8255
8256 if (!programBinary->setUniform4uiv(location, count, value))
8257 {
8258 return gl::error(GL_INVALID_OPERATION);
8259 }
8260 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008261 }
8262 catch(std::bad_alloc&)
8263 {
8264 return gl::error(GL_OUT_OF_MEMORY);
8265 }
8266}
8267
8268void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8269{
8270 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8271 buffer, drawbuffer, value);
8272
8273 try
8274 {
8275 gl::Context *context = gl::getNonLostContext();
8276
8277 if (context)
8278 {
8279 if (context->getClientVersion() < 3)
8280 {
8281 return gl::error(GL_INVALID_OPERATION);
8282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008283
Geoff Lang42359ca2013-08-21 13:25:17 -04008284 switch (buffer)
8285 {
8286 case GL_COLOR:
8287 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8288 {
8289 return gl::error(GL_INVALID_VALUE);
8290 }
8291 break;
8292 case GL_STENCIL:
8293 if (drawbuffer != 0)
8294 {
8295 return gl::error(GL_INVALID_VALUE);
8296 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008297 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008298 default:
8299 return gl::error(GL_INVALID_ENUM);
8300 }
8301
8302 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008304 }
8305 catch(std::bad_alloc&)
8306 {
8307 return gl::error(GL_OUT_OF_MEMORY);
8308 }
8309}
8310
8311void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8312{
8313 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8314 buffer, drawbuffer, value);
8315
8316 try
8317 {
8318 gl::Context *context = gl::getNonLostContext();
8319
8320 if (context)
8321 {
8322 if (context->getClientVersion() < 3)
8323 {
8324 return gl::error(GL_INVALID_OPERATION);
8325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008326
Geoff Lang42359ca2013-08-21 13:25:17 -04008327 switch (buffer)
8328 {
8329 case GL_COLOR:
8330 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8331 {
8332 return gl::error(GL_INVALID_VALUE);
8333 }
8334 break;
8335 default:
8336 return gl::error(GL_INVALID_ENUM);
8337 }
8338
8339 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341 }
8342 catch(std::bad_alloc&)
8343 {
8344 return gl::error(GL_OUT_OF_MEMORY);
8345 }
8346}
8347
8348void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8349{
8350 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8351 buffer, drawbuffer, value);
8352
8353 try
8354 {
8355 gl::Context *context = gl::getNonLostContext();
8356
8357 if (context)
8358 {
8359 if (context->getClientVersion() < 3)
8360 {
8361 return gl::error(GL_INVALID_OPERATION);
8362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008363
Geoff Lang42359ca2013-08-21 13:25:17 -04008364 switch (buffer)
8365 {
8366 case GL_COLOR:
8367 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8368 {
8369 return gl::error(GL_INVALID_VALUE);
8370 }
8371 break;
8372 case GL_DEPTH:
8373 if (drawbuffer != 0)
8374 {
8375 return gl::error(GL_INVALID_VALUE);
8376 }
8377 break;
8378 default:
8379 return gl::error(GL_INVALID_ENUM);
8380 }
8381
8382 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008383 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008384 }
8385 catch(std::bad_alloc&)
8386 {
8387 return gl::error(GL_OUT_OF_MEMORY);
8388 }
8389}
8390
8391void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8392{
8393 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8394 buffer, drawbuffer, depth, stencil);
8395
8396 try
8397 {
8398 gl::Context *context = gl::getNonLostContext();
8399
8400 if (context)
8401 {
8402 if (context->getClientVersion() < 3)
8403 {
8404 return gl::error(GL_INVALID_OPERATION);
8405 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008406
Geoff Lang42359ca2013-08-21 13:25:17 -04008407 switch (buffer)
8408 {
8409 case GL_DEPTH_STENCIL:
8410 if (drawbuffer != 0)
8411 {
8412 return gl::error(GL_INVALID_VALUE);
8413 }
8414 break;
8415 default:
8416 return gl::error(GL_INVALID_ENUM);
8417 }
8418
8419 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008421 }
8422 catch(std::bad_alloc&)
8423 {
8424 return gl::error(GL_OUT_OF_MEMORY);
8425 }
8426}
8427
8428const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8429{
8430 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8431
8432 try
8433 {
8434 gl::Context *context = gl::getNonLostContext();
8435
8436 if (context)
8437 {
8438 if (context->getClientVersion() < 3)
8439 {
8440 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008442
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008443 if (name != GL_EXTENSIONS)
8444 {
8445 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8446 }
8447
8448 if (index >= context->getNumExtensions())
8449 {
8450 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8451 }
8452
8453 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8454 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008455 }
8456 catch(std::bad_alloc&)
8457 {
8458 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8459 }
8460
8461 return NULL;
8462}
8463
8464void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8465{
8466 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8467 readTarget, writeTarget, readOffset, writeOffset, size);
8468
8469 try
8470 {
8471 gl::Context *context = gl::getNonLostContext();
8472
8473 if (context)
8474 {
8475 if (context->getClientVersion() < 3)
8476 {
8477 return gl::error(GL_INVALID_OPERATION);
8478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008479
Jamie Madill8c96d582014-03-05 15:01:23 -05008480 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008481 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008482 return gl::error(GL_INVALID_ENUM);
8483 }
8484
Jamie Madill8c96d582014-03-05 15:01:23 -05008485 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8486 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008487
8488 if (!readBuffer || !writeBuffer)
8489 {
8490 return gl::error(GL_INVALID_OPERATION);
8491 }
8492
Jamie Madill7a5f7382014-03-05 15:01:24 -05008493 if (readBuffer->mapped() || writeBuffer->mapped())
8494 {
8495 return gl::error(GL_INVALID_OPERATION);
8496 }
8497
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008498 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8499 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8500 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8501 {
8502 return gl::error(GL_INVALID_VALUE);
8503 }
8504
8505 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8506 {
8507 return gl::error(GL_INVALID_VALUE);
8508 }
8509
8510 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8511
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008512 // if size is zero, the copy is a successful no-op
8513 if (size > 0)
8514 {
8515 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8516 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008517 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008518 }
8519 catch(std::bad_alloc&)
8520 {
8521 return gl::error(GL_OUT_OF_MEMORY);
8522 }
8523}
8524
8525void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8526{
8527 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8528 program, uniformCount, uniformNames, uniformIndices);
8529
8530 try
8531 {
8532 gl::Context *context = gl::getNonLostContext();
8533
8534 if (context)
8535 {
8536 if (context->getClientVersion() < 3)
8537 {
8538 return gl::error(GL_INVALID_OPERATION);
8539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008540
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008541 if (uniformCount < 0)
8542 {
8543 return gl::error(GL_INVALID_VALUE);
8544 }
8545
8546 gl::Program *programObject = context->getProgram(program);
8547
8548 if (!programObject)
8549 {
8550 if (context->getShader(program))
8551 {
8552 return gl::error(GL_INVALID_OPERATION);
8553 }
8554 else
8555 {
8556 return gl::error(GL_INVALID_VALUE);
8557 }
8558 }
8559
8560 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8561 if (!programObject->isLinked() || !programBinary)
8562 {
8563 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8564 {
8565 uniformIndices[uniformId] = GL_INVALID_INDEX;
8566 }
8567 }
8568 else
8569 {
8570 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8571 {
8572 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8573 }
8574 }
8575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008576 }
8577 catch(std::bad_alloc&)
8578 {
8579 return gl::error(GL_OUT_OF_MEMORY);
8580 }
8581}
8582
8583void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8584{
8585 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8586 program, uniformCount, uniformIndices, pname, params);
8587
8588 try
8589 {
8590 gl::Context *context = gl::getNonLostContext();
8591
8592 if (context)
8593 {
8594 if (context->getClientVersion() < 3)
8595 {
8596 return gl::error(GL_INVALID_OPERATION);
8597 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008598
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008599 if (uniformCount < 0)
8600 {
8601 return gl::error(GL_INVALID_VALUE);
8602 }
8603
8604 gl::Program *programObject = context->getProgram(program);
8605
8606 if (!programObject)
8607 {
8608 if (context->getShader(program))
8609 {
8610 return gl::error(GL_INVALID_OPERATION);
8611 }
8612 else
8613 {
8614 return gl::error(GL_INVALID_VALUE);
8615 }
8616 }
8617
8618 switch (pname)
8619 {
8620 case GL_UNIFORM_TYPE:
8621 case GL_UNIFORM_SIZE:
8622 case GL_UNIFORM_NAME_LENGTH:
8623 case GL_UNIFORM_BLOCK_INDEX:
8624 case GL_UNIFORM_OFFSET:
8625 case GL_UNIFORM_ARRAY_STRIDE:
8626 case GL_UNIFORM_MATRIX_STRIDE:
8627 case GL_UNIFORM_IS_ROW_MAJOR:
8628 break;
8629 default:
8630 return gl::error(GL_INVALID_ENUM);
8631 }
8632
8633 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8634
8635 if (!programBinary && uniformCount > 0)
8636 {
8637 return gl::error(GL_INVALID_VALUE);
8638 }
8639
8640 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8641 {
8642 const GLuint index = uniformIndices[uniformId];
8643
8644 if (index >= (GLuint)programBinary->getActiveUniformCount())
8645 {
8646 return gl::error(GL_INVALID_VALUE);
8647 }
8648 }
8649
8650 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8651 {
8652 const GLuint index = uniformIndices[uniformId];
8653 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8654 }
8655 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008656 }
8657 catch(std::bad_alloc&)
8658 {
8659 return gl::error(GL_OUT_OF_MEMORY);
8660 }
8661}
8662
8663GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8664{
8665 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8666
8667 try
8668 {
8669 gl::Context *context = gl::getNonLostContext();
8670
8671 if (context)
8672 {
8673 if (context->getClientVersion() < 3)
8674 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008675 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008677
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008678 gl::Program *programObject = context->getProgram(program);
8679
8680 if (!programObject)
8681 {
8682 if (context->getShader(program))
8683 {
8684 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8685 }
8686 else
8687 {
8688 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8689 }
8690 }
8691
8692 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8693 if (!programBinary)
8694 {
8695 return GL_INVALID_INDEX;
8696 }
8697
8698 return programBinary->getUniformBlockIndex(uniformBlockName);
8699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008700 }
8701 catch(std::bad_alloc&)
8702 {
8703 return gl::error(GL_OUT_OF_MEMORY, 0);
8704 }
8705
8706 return 0;
8707}
8708
8709void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8710{
8711 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8712 program, uniformBlockIndex, pname, params);
8713
8714 try
8715 {
8716 gl::Context *context = gl::getNonLostContext();
8717
8718 if (context)
8719 {
8720 if (context->getClientVersion() < 3)
8721 {
8722 return gl::error(GL_INVALID_OPERATION);
8723 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008724 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008725
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008726 if (!programObject)
8727 {
8728 if (context->getShader(program))
8729 {
8730 return gl::error(GL_INVALID_OPERATION);
8731 }
8732 else
8733 {
8734 return gl::error(GL_INVALID_VALUE);
8735 }
8736 }
8737
8738 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8739
8740 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8741 {
8742 return gl::error(GL_INVALID_VALUE);
8743 }
8744
8745 switch (pname)
8746 {
8747 case GL_UNIFORM_BLOCK_BINDING:
8748 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8749 break;
8750
8751 case GL_UNIFORM_BLOCK_DATA_SIZE:
8752 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8753 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8754 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8755 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8756 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8757 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8758 break;
8759
8760 default:
8761 return gl::error(GL_INVALID_ENUM);
8762 }
8763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008764 }
8765 catch(std::bad_alloc&)
8766 {
8767 return gl::error(GL_OUT_OF_MEMORY);
8768 }
8769}
8770
8771void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8772{
8773 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8774 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8775
8776 try
8777 {
8778 gl::Context *context = gl::getNonLostContext();
8779
8780 if (context)
8781 {
8782 if (context->getClientVersion() < 3)
8783 {
8784 return gl::error(GL_INVALID_OPERATION);
8785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008786
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008787 gl::Program *programObject = context->getProgram(program);
8788
8789 if (!programObject)
8790 {
8791 if (context->getShader(program))
8792 {
8793 return gl::error(GL_INVALID_OPERATION);
8794 }
8795 else
8796 {
8797 return gl::error(GL_INVALID_VALUE);
8798 }
8799 }
8800
8801 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8802
8803 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8804 {
8805 return gl::error(GL_INVALID_VALUE);
8806 }
8807
8808 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008810 }
8811 catch(std::bad_alloc&)
8812 {
8813 return gl::error(GL_OUT_OF_MEMORY);
8814 }
8815}
8816
8817void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8818{
8819 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8820 program, uniformBlockIndex, uniformBlockBinding);
8821
8822 try
8823 {
8824 gl::Context *context = gl::getNonLostContext();
8825
8826 if (context)
8827 {
8828 if (context->getClientVersion() < 3)
8829 {
8830 return gl::error(GL_INVALID_OPERATION);
8831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008832
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008833 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8834 {
8835 return gl::error(GL_INVALID_VALUE);
8836 }
8837
8838 gl::Program *programObject = context->getProgram(program);
8839
8840 if (!programObject)
8841 {
8842 if (context->getShader(program))
8843 {
8844 return gl::error(GL_INVALID_OPERATION);
8845 }
8846 else
8847 {
8848 return gl::error(GL_INVALID_VALUE);
8849 }
8850 }
8851
8852 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8853
8854 // if never linked, there won't be any uniform blocks
8855 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8856 {
8857 return gl::error(GL_INVALID_VALUE);
8858 }
8859
8860 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008862 }
8863 catch(std::bad_alloc&)
8864 {
8865 return gl::error(GL_OUT_OF_MEMORY);
8866 }
8867}
8868
8869void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8870{
8871 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8872 mode, first, count, instanceCount);
8873
8874 try
8875 {
8876 gl::Context *context = gl::getNonLostContext();
8877
8878 if (context)
8879 {
8880 if (context->getClientVersion() < 3)
8881 {
8882 return gl::error(GL_INVALID_OPERATION);
8883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008884
Jamie Madill54133512013-06-21 09:33:07 -04008885 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008886 UNIMPLEMENTED();
8887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008888 }
8889 catch(std::bad_alloc&)
8890 {
8891 return gl::error(GL_OUT_OF_MEMORY);
8892 }
8893}
8894
8895void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8896{
8897 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8898 mode, count, type, indices, instanceCount);
8899
8900 try
8901 {
8902 gl::Context *context = gl::getNonLostContext();
8903
8904 if (context)
8905 {
8906 if (context->getClientVersion() < 3)
8907 {
8908 return gl::error(GL_INVALID_OPERATION);
8909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008910
Jamie Madill54133512013-06-21 09:33:07 -04008911 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008912 UNIMPLEMENTED();
8913 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008914 }
8915 catch(std::bad_alloc&)
8916 {
8917 return gl::error(GL_OUT_OF_MEMORY);
8918 }
8919}
8920
8921GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8922{
8923 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8924
8925 try
8926 {
8927 gl::Context *context = gl::getNonLostContext();
8928
8929 if (context)
8930 {
8931 if (context->getClientVersion() < 3)
8932 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008933 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008935
Jamie Madill5215e1a2013-07-26 11:55:19 -04008936 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8937 {
8938 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8939 }
8940
8941 if (flags != 0)
8942 {
8943 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8944 }
8945
8946 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008947 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008948 }
8949 catch(std::bad_alloc&)
8950 {
8951 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8952 }
8953
8954 return NULL;
8955}
8956
8957GLboolean __stdcall glIsSync(GLsync sync)
8958{
8959 EVENT("(GLsync sync = 0x%0.8p)", sync);
8960
8961 try
8962 {
8963 gl::Context *context = gl::getNonLostContext();
8964
8965 if (context)
8966 {
8967 if (context->getClientVersion() < 3)
8968 {
8969 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008971
Jamie Madill5215e1a2013-07-26 11:55:19 -04008972 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008974 }
8975 catch(std::bad_alloc&)
8976 {
8977 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8978 }
8979
8980 return GL_FALSE;
8981}
8982
8983void __stdcall glDeleteSync(GLsync sync)
8984{
8985 EVENT("(GLsync sync = 0x%0.8p)", sync);
8986
8987 try
8988 {
8989 gl::Context *context = gl::getNonLostContext();
8990
8991 if (context)
8992 {
8993 if (context->getClientVersion() < 3)
8994 {
8995 return gl::error(GL_INVALID_OPERATION);
8996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008997
Jamie Madill5215e1a2013-07-26 11:55:19 -04008998 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8999 {
9000 return gl::error(GL_INVALID_VALUE);
9001 }
9002
9003 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009005 }
9006 catch(std::bad_alloc&)
9007 {
9008 return gl::error(GL_OUT_OF_MEMORY);
9009 }
9010}
9011
9012GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9013{
9014 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9015 sync, flags, timeout);
9016
9017 try
9018 {
9019 gl::Context *context = gl::getNonLostContext();
9020
9021 if (context)
9022 {
9023 if (context->getClientVersion() < 3)
9024 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009025 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009027
Jamie Madill5215e1a2013-07-26 11:55:19 -04009028 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9029 {
9030 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9031 }
9032
9033 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9034
9035 if (!fenceSync)
9036 {
9037 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9038 }
9039
9040 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009041 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009042 }
9043 catch(std::bad_alloc&)
9044 {
9045 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9046 }
9047
9048 return GL_FALSE;
9049}
9050
9051void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9052{
9053 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9054 sync, flags, timeout);
9055
9056 try
9057 {
9058 gl::Context *context = gl::getNonLostContext();
9059
9060 if (context)
9061 {
9062 if (context->getClientVersion() < 3)
9063 {
9064 return gl::error(GL_INVALID_OPERATION);
9065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009066
Jamie Madill5215e1a2013-07-26 11:55:19 -04009067 if (flags != 0)
9068 {
9069 return gl::error(GL_INVALID_VALUE);
9070 }
9071
9072 if (timeout != GL_TIMEOUT_IGNORED)
9073 {
9074 return gl::error(GL_INVALID_VALUE);
9075 }
9076
9077 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9078
9079 if (!fenceSync)
9080 {
9081 return gl::error(GL_INVALID_VALUE);
9082 }
9083
9084 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009085 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009086 }
9087 catch(std::bad_alloc&)
9088 {
9089 return gl::error(GL_OUT_OF_MEMORY);
9090 }
9091}
9092
9093void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9094{
9095 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9096 pname, params);
9097
9098 try
9099 {
9100 gl::Context *context = gl::getNonLostContext();
9101
9102 if (context)
9103 {
9104 if (context->getClientVersion() < 3)
9105 {
9106 return gl::error(GL_INVALID_OPERATION);
9107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009108
Jamie Madill79f2f452013-12-19 11:13:02 -05009109 GLenum nativeType;
9110 unsigned int numParams = 0;
9111 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9112 return gl::error(GL_INVALID_ENUM);
9113
9114 // pname is valid, but that there are no parameters to return.
9115 if (numParams == 0)
9116 return;
9117
9118 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009119 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009120 context->getInteger64v(pname, params);
9121 }
Jamie Madill55856b12014-01-02 13:59:50 -05009122 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009123 {
Jamie Madill55856b12014-01-02 13:59:50 -05009124 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009125 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009127 }
9128 catch(std::bad_alloc&)
9129 {
9130 return gl::error(GL_OUT_OF_MEMORY);
9131 }
9132}
9133
9134void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9135{
9136 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9137 sync, pname, bufSize, length, values);
9138
9139 try
9140 {
9141 gl::Context *context = gl::getNonLostContext();
9142
9143 if (context)
9144 {
9145 if (context->getClientVersion() < 3)
9146 {
9147 return gl::error(GL_INVALID_OPERATION);
9148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009149
Jamie Madill5215e1a2013-07-26 11:55:19 -04009150 if (bufSize < 0)
9151 {
9152 return gl::error(GL_INVALID_VALUE);
9153 }
9154
9155 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9156
9157 if (!fenceSync)
9158 {
9159 return gl::error(GL_INVALID_VALUE);
9160 }
9161
9162 switch (pname)
9163 {
9164 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9165 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9166 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9167 case GL_SYNC_FLAGS: values[0] = 0; break;
9168
9169 default:
9170 return gl::error(GL_INVALID_ENUM);
9171 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009173 }
9174 catch(std::bad_alloc&)
9175 {
9176 return gl::error(GL_OUT_OF_MEMORY);
9177 }
9178}
9179
9180void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9181{
9182 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9183 target, index, data);
9184
9185 try
9186 {
9187 gl::Context *context = gl::getNonLostContext();
9188
9189 if (context)
9190 {
9191 if (context->getClientVersion() < 3)
9192 {
9193 return gl::error(GL_INVALID_OPERATION);
9194 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009195
Shannon Woods15934d52013-08-19 14:28:49 -04009196 switch (target)
9197 {
9198 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9199 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9200 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9201 if (index >= context->getMaxTransformFeedbackBufferBindings())
9202 return gl::error(GL_INVALID_VALUE);
9203 break;
9204 case GL_UNIFORM_BUFFER_START:
9205 case GL_UNIFORM_BUFFER_SIZE:
9206 case GL_UNIFORM_BUFFER_BINDING:
9207 if (index >= context->getMaximumCombinedUniformBufferBindings())
9208 return gl::error(GL_INVALID_VALUE);
9209 break;
9210 default:
9211 return gl::error(GL_INVALID_ENUM);
9212 }
9213
9214 if (!(context->getIndexedInteger64v(target, index, data)))
9215 {
9216 GLenum nativeType;
9217 unsigned int numParams = 0;
9218 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9219 return gl::error(GL_INVALID_ENUM);
9220
9221 if (numParams == 0)
9222 return; // it is known that pname is valid, but there are no parameters to return
9223
9224 if (nativeType == GL_INT)
9225 {
9226 GLint *intParams = new GLint[numParams];
9227
9228 context->getIndexedIntegerv(target, index, intParams);
9229
9230 for (unsigned int i = 0; i < numParams; ++i)
9231 {
9232 data[i] = static_cast<GLint64>(intParams[i]);
9233 }
9234
9235 delete [] intParams;
9236 }
9237 else
9238 {
9239 UNREACHABLE();
9240 }
9241 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009243 }
9244 catch(std::bad_alloc&)
9245 {
9246 return gl::error(GL_OUT_OF_MEMORY);
9247 }
9248}
9249
9250void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9251{
9252 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9253 target, pname, params);
9254
9255 try
9256 {
9257 gl::Context *context = gl::getNonLostContext();
9258
9259 if (context)
9260 {
9261 if (context->getClientVersion() < 3)
9262 {
9263 return gl::error(GL_INVALID_OPERATION);
9264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009265
Jamie Madill70656a62014-03-05 15:01:26 -05009266 if (!gl::ValidBufferTarget(context, target))
9267 {
9268 return gl::error(GL_INVALID_ENUM);
9269 }
9270
9271 if (!gl::ValidBufferParameter(context, pname))
9272 {
9273 return gl::error(GL_INVALID_ENUM);
9274 }
9275
9276 gl::Buffer *buffer = context->getTargetBuffer(target);
9277
9278 if (!buffer)
9279 {
9280 // A null buffer means that "0" is bound to the requested buffer target
9281 return gl::error(GL_INVALID_OPERATION);
9282 }
9283
9284 switch (pname)
9285 {
9286 case GL_BUFFER_USAGE:
9287 *params = static_cast<GLint64>(buffer->usage());
9288 break;
9289 case GL_BUFFER_SIZE:
9290 *params = buffer->size();
9291 break;
9292 case GL_BUFFER_ACCESS_FLAGS:
9293 *params = static_cast<GLint64>(buffer->accessFlags());
9294 break;
9295 case GL_BUFFER_MAPPED:
9296 *params = static_cast<GLint64>(buffer->mapped());
9297 break;
9298 case GL_BUFFER_MAP_OFFSET:
9299 *params = buffer->mapOffset();
9300 break;
9301 case GL_BUFFER_MAP_LENGTH:
9302 *params = buffer->mapLength();
9303 break;
9304 default: UNREACHABLE(); break;
9305 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009307 }
9308 catch(std::bad_alloc&)
9309 {
9310 return gl::error(GL_OUT_OF_MEMORY);
9311 }
9312}
9313
9314void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9315{
9316 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9317
9318 try
9319 {
9320 gl::Context *context = gl::getNonLostContext();
9321
9322 if (context)
9323 {
9324 if (context->getClientVersion() < 3)
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009329 if (count < 0)
9330 {
9331 return gl::error(GL_INVALID_VALUE);
9332 }
9333
9334 for (int i = 0; i < count; i++)
9335 {
9336 samplers[i] = context->createSampler();
9337 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009338 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009339 }
9340 catch(std::bad_alloc&)
9341 {
9342 return gl::error(GL_OUT_OF_MEMORY);
9343 }
9344}
9345
9346void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9347{
9348 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9349
9350 try
9351 {
9352 gl::Context *context = gl::getNonLostContext();
9353
9354 if (context)
9355 {
9356 if (context->getClientVersion() < 3)
9357 {
9358 return gl::error(GL_INVALID_OPERATION);
9359 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009360
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009361 if (count < 0)
9362 {
9363 return gl::error(GL_INVALID_VALUE);
9364 }
9365
9366 for (int i = 0; i < count; i++)
9367 {
9368 context->deleteSampler(samplers[i]);
9369 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009370 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009371 }
9372 catch(std::bad_alloc&)
9373 {
9374 return gl::error(GL_OUT_OF_MEMORY);
9375 }
9376}
9377
9378GLboolean __stdcall glIsSampler(GLuint sampler)
9379{
9380 EVENT("(GLuint sampler = %u)", sampler);
9381
9382 try
9383 {
9384 gl::Context *context = gl::getNonLostContext();
9385
9386 if (context)
9387 {
9388 if (context->getClientVersion() < 3)
9389 {
9390 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009392
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009393 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009395 }
9396 catch(std::bad_alloc&)
9397 {
9398 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9399 }
9400
9401 return GL_FALSE;
9402}
9403
9404void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9405{
9406 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9407
9408 try
9409 {
9410 gl::Context *context = gl::getNonLostContext();
9411
9412 if (context)
9413 {
9414 if (context->getClientVersion() < 3)
9415 {
9416 return gl::error(GL_INVALID_OPERATION);
9417 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009418
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009419 if (sampler != 0 && !context->isSampler(sampler))
9420 {
9421 return gl::error(GL_INVALID_OPERATION);
9422 }
9423
9424 if (unit >= context->getMaximumCombinedTextureImageUnits())
9425 {
9426 return gl::error(GL_INVALID_VALUE);
9427 }
9428
9429 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009430 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009431 }
9432 catch(std::bad_alloc&)
9433 {
9434 return gl::error(GL_OUT_OF_MEMORY);
9435 }
9436}
9437
9438void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9439{
9440 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9441
9442 try
9443 {
9444 gl::Context *context = gl::getNonLostContext();
9445
9446 if (context)
9447 {
9448 if (context->getClientVersion() < 3)
9449 {
9450 return gl::error(GL_INVALID_OPERATION);
9451 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009452
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009453 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009454 {
9455 return;
9456 }
9457
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009458 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009459 {
9460 return;
9461 }
9462
9463 if (!context->isSampler(sampler))
9464 {
9465 return gl::error(GL_INVALID_OPERATION);
9466 }
9467
9468 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009469 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009470 }
9471 catch(std::bad_alloc&)
9472 {
9473 return gl::error(GL_OUT_OF_MEMORY);
9474 }
9475}
9476
9477void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9478{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009479 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009480}
9481
9482void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9483{
9484 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9485
9486 try
9487 {
9488 gl::Context *context = gl::getNonLostContext();
9489
9490 if (context)
9491 {
9492 if (context->getClientVersion() < 3)
9493 {
9494 return gl::error(GL_INVALID_OPERATION);
9495 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009496
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009497 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009498 {
9499 return;
9500 }
9501
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009502 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009503 {
9504 return;
9505 }
9506
9507 if (!context->isSampler(sampler))
9508 {
9509 return gl::error(GL_INVALID_OPERATION);
9510 }
9511
9512 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009514 }
9515 catch(std::bad_alloc&)
9516 {
9517 return gl::error(GL_OUT_OF_MEMORY);
9518 }
9519}
9520
9521void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9522{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009523 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009524}
9525
9526void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9527{
9528 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9529
9530 try
9531 {
9532 gl::Context *context = gl::getNonLostContext();
9533
9534 if (context)
9535 {
9536 if (context->getClientVersion() < 3)
9537 {
9538 return gl::error(GL_INVALID_OPERATION);
9539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009540
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009541 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009542 {
9543 return;
9544 }
9545
9546 if (!context->isSampler(sampler))
9547 {
9548 return gl::error(GL_INVALID_OPERATION);
9549 }
9550
9551 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009553 }
9554 catch(std::bad_alloc&)
9555 {
9556 return gl::error(GL_OUT_OF_MEMORY);
9557 }
9558}
9559
9560void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9561{
9562 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9563
9564 try
9565 {
9566 gl::Context *context = gl::getNonLostContext();
9567
9568 if (context)
9569 {
9570 if (context->getClientVersion() < 3)
9571 {
9572 return gl::error(GL_INVALID_OPERATION);
9573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009574
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009575 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009576 {
9577 return;
9578 }
9579
9580 if (!context->isSampler(sampler))
9581 {
9582 return gl::error(GL_INVALID_OPERATION);
9583 }
9584
9585 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009587 }
9588 catch(std::bad_alloc&)
9589 {
9590 return gl::error(GL_OUT_OF_MEMORY);
9591 }
9592}
9593
9594void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9595{
9596 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9597
9598 try
9599 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009600 if (index >= gl::MAX_VERTEX_ATTRIBS)
9601 {
9602 return gl::error(GL_INVALID_VALUE);
9603 }
9604
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009605 gl::Context *context = gl::getNonLostContext();
9606
9607 if (context)
9608 {
9609 if (context->getClientVersion() < 3)
9610 {
9611 return gl::error(GL_INVALID_OPERATION);
9612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009613
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009614 context->setVertexAttribDivisor(index, divisor);
9615 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009616 }
9617 catch(std::bad_alloc&)
9618 {
9619 return gl::error(GL_OUT_OF_MEMORY);
9620 }
9621}
9622
9623void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9624{
9625 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9626
9627 try
9628 {
9629 gl::Context *context = gl::getNonLostContext();
9630
9631 if (context)
9632 {
9633 if (context->getClientVersion() < 3)
9634 {
9635 return gl::error(GL_INVALID_OPERATION);
9636 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009637
Geoff Langc8058452014-02-03 12:04:11 -05009638 switch (target)
9639 {
9640 case GL_TRANSFORM_FEEDBACK:
9641 {
9642 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9643 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9644 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9645 {
9646 return gl::error(GL_INVALID_OPERATION);
9647 }
9648
9649 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9650 if (context->getTransformFeedback(id) == NULL)
9651 {
9652 return gl::error(GL_INVALID_OPERATION);
9653 }
9654
9655 context->bindTransformFeedback(id);
9656 }
9657 break;
9658
9659 default:
9660 return gl::error(GL_INVALID_ENUM);
9661 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009663 }
9664 catch(std::bad_alloc&)
9665 {
9666 return gl::error(GL_OUT_OF_MEMORY);
9667 }
9668}
9669
9670void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9671{
9672 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9673
9674 try
9675 {
9676 gl::Context *context = gl::getNonLostContext();
9677
9678 if (context)
9679 {
9680 if (context->getClientVersion() < 3)
9681 {
9682 return gl::error(GL_INVALID_OPERATION);
9683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009684
Geoff Langc8058452014-02-03 12:04:11 -05009685 for (int i = 0; i < n; i++)
9686 {
9687 context->deleteTransformFeedback(ids[i]);
9688 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009689 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009690 }
9691 catch(std::bad_alloc&)
9692 {
9693 return gl::error(GL_OUT_OF_MEMORY);
9694 }
9695}
9696
9697void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9698{
9699 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9700
9701 try
9702 {
9703 gl::Context *context = gl::getNonLostContext();
9704
9705 if (context)
9706 {
9707 if (context->getClientVersion() < 3)
9708 {
9709 return gl::error(GL_INVALID_OPERATION);
9710 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009711
Geoff Langc8058452014-02-03 12:04:11 -05009712 for (int i = 0; i < n; i++)
9713 {
9714 ids[i] = context->createTransformFeedback();
9715 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009717 }
9718 catch(std::bad_alloc&)
9719 {
9720 return gl::error(GL_OUT_OF_MEMORY);
9721 }
9722}
9723
9724GLboolean __stdcall glIsTransformFeedback(GLuint id)
9725{
9726 EVENT("(GLuint id = %u)", id);
9727
9728 try
9729 {
9730 gl::Context *context = gl::getNonLostContext();
9731
9732 if (context)
9733 {
9734 if (context->getClientVersion() < 3)
9735 {
9736 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9737 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009738
Geoff Langc8058452014-02-03 12:04:11 -05009739 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009740 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009741 }
9742 catch(std::bad_alloc&)
9743 {
9744 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9745 }
9746
9747 return GL_FALSE;
9748}
9749
9750void __stdcall glPauseTransformFeedback(void)
9751{
9752 EVENT("(void)");
9753
9754 try
9755 {
9756 gl::Context *context = gl::getNonLostContext();
9757
9758 if (context)
9759 {
9760 if (context->getClientVersion() < 3)
9761 {
9762 return gl::error(GL_INVALID_OPERATION);
9763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009764
Geoff Langc8058452014-02-03 12:04:11 -05009765 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9766 ASSERT(transformFeedback != NULL);
9767
9768 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9769 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9770 {
9771 return gl::error(GL_INVALID_OPERATION);
9772 }
9773
9774 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009775 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009776 }
9777 catch(std::bad_alloc&)
9778 {
9779 return gl::error(GL_OUT_OF_MEMORY);
9780 }
9781}
9782
9783void __stdcall glResumeTransformFeedback(void)
9784{
9785 EVENT("(void)");
9786
9787 try
9788 {
9789 gl::Context *context = gl::getNonLostContext();
9790
9791 if (context)
9792 {
9793 if (context->getClientVersion() < 3)
9794 {
9795 return gl::error(GL_INVALID_OPERATION);
9796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009797
Geoff Langc8058452014-02-03 12:04:11 -05009798 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9799 ASSERT(transformFeedback != NULL);
9800
9801 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9802 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9803 {
9804 return gl::error(GL_INVALID_OPERATION);
9805 }
9806
9807 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009809 }
9810 catch(std::bad_alloc&)
9811 {
9812 return gl::error(GL_OUT_OF_MEMORY);
9813 }
9814}
9815
9816void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9817{
9818 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9819 program, bufSize, length, binaryFormat, binary);
9820
9821 try
9822 {
9823 gl::Context *context = gl::getNonLostContext();
9824
9825 if (context)
9826 {
9827 if (context->getClientVersion() < 3)
9828 {
9829 return gl::error(GL_INVALID_OPERATION);
9830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009831
Jamie Madill54133512013-06-21 09:33:07 -04009832 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009833 UNIMPLEMENTED();
9834 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009835 }
9836 catch(std::bad_alloc&)
9837 {
9838 return gl::error(GL_OUT_OF_MEMORY);
9839 }
9840}
9841
9842void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9843{
9844 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9845 program, binaryFormat, binary, length);
9846
9847 try
9848 {
9849 gl::Context *context = gl::getNonLostContext();
9850
9851 if (context)
9852 {
9853 if (context->getClientVersion() < 3)
9854 {
9855 return gl::error(GL_INVALID_OPERATION);
9856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009857
Jamie Madill54133512013-06-21 09:33:07 -04009858 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009859 UNIMPLEMENTED();
9860 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009861 }
9862 catch(std::bad_alloc&)
9863 {
9864 return gl::error(GL_OUT_OF_MEMORY);
9865 }
9866}
9867
9868void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9869{
9870 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9871 program, pname, value);
9872
9873 try
9874 {
9875 gl::Context *context = gl::getNonLostContext();
9876
9877 if (context)
9878 {
9879 if (context->getClientVersion() < 3)
9880 {
9881 return gl::error(GL_INVALID_OPERATION);
9882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009883
Jamie Madill54133512013-06-21 09:33:07 -04009884 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009885 UNIMPLEMENTED();
9886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009887 }
9888 catch(std::bad_alloc&)
9889 {
9890 return gl::error(GL_OUT_OF_MEMORY);
9891 }
9892}
9893
9894void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9895{
9896 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9897 target, numAttachments, attachments);
9898
9899 try
9900 {
9901 gl::Context *context = gl::getNonLostContext();
9902
9903 if (context)
9904 {
9905 if (context->getClientVersion() < 3)
9906 {
9907 return gl::error(GL_INVALID_OPERATION);
9908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009909
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009910 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009911 {
9912 return;
9913 }
9914
9915 int maxDimension = context->getMaximumRenderbufferDimension();
9916 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009918 }
9919 catch(std::bad_alloc&)
9920 {
9921 return gl::error(GL_OUT_OF_MEMORY);
9922 }
9923}
9924
9925void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9926{
9927 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9928 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9929 target, numAttachments, attachments, x, y, width, height);
9930
9931 try
9932 {
9933 gl::Context *context = gl::getNonLostContext();
9934
9935 if (context)
9936 {
9937 if (context->getClientVersion() < 3)
9938 {
9939 return gl::error(GL_INVALID_OPERATION);
9940 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009941
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009942 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009943 {
9944 return;
9945 }
9946
9947 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009949 }
9950 catch(std::bad_alloc&)
9951 {
9952 return gl::error(GL_OUT_OF_MEMORY);
9953 }
9954}
9955
9956void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9957{
9958 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9959 target, levels, internalformat, width, height);
9960
9961 try
9962 {
9963 gl::Context *context = gl::getNonLostContext();
9964
9965 if (context)
9966 {
9967 if (context->getClientVersion() < 3)
9968 {
9969 return gl::error(GL_INVALID_OPERATION);
9970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009971
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009972 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009973 {
9974 return;
9975 }
9976
9977 switch (target)
9978 {
9979 case GL_TEXTURE_2D:
9980 {
9981 gl::Texture2D *texture2d = context->getTexture2D();
9982 texture2d->storage(levels, internalformat, width, height);
9983 }
9984 break;
9985
Geoff Lang01c21d22013-09-24 11:52:16 -04009986 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009987 {
9988 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9989 textureCube->storage(levels, internalformat, width);
9990 }
9991 break;
9992
9993 default:
9994 return gl::error(GL_INVALID_ENUM);
9995 }
9996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009997 }
9998 catch(std::bad_alloc&)
9999 {
10000 return gl::error(GL_OUT_OF_MEMORY);
10001 }
10002}
10003
10004void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10005{
10006 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10007 "GLsizei height = %d, GLsizei depth = %d)",
10008 target, levels, internalformat, width, height, depth);
10009
10010 try
10011 {
10012 gl::Context *context = gl::getNonLostContext();
10013
10014 if (context)
10015 {
10016 if (context->getClientVersion() < 3)
10017 {
10018 return gl::error(GL_INVALID_OPERATION);
10019 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010020
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010021 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010022 {
10023 return;
10024 }
10025
10026 switch (target)
10027 {
10028 case GL_TEXTURE_3D:
10029 {
10030 gl::Texture3D *texture3d = context->getTexture3D();
10031 texture3d->storage(levels, internalformat, width, height, depth);
10032 }
10033 break;
10034
10035 case GL_TEXTURE_2D_ARRAY:
10036 {
10037 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10038 texture2darray->storage(levels, internalformat, width, height, depth);
10039 }
10040 break;
10041
10042 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010043 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010044 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010045 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010046 }
10047 catch(std::bad_alloc&)
10048 {
10049 return gl::error(GL_OUT_OF_MEMORY);
10050 }
10051}
10052
10053void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10054{
10055 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10056 "GLint* params = 0x%0.8p)",
10057 target, internalformat, pname, bufSize, params);
10058
10059 try
10060 {
10061 gl::Context *context = gl::getNonLostContext();
10062
10063 if (context)
10064 {
10065 if (context->getClientVersion() < 3)
10066 {
10067 return gl::error(GL_INVALID_OPERATION);
10068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010069
Shannon Woods809d2502013-07-08 10:32:18 -040010070 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10071 !gl::IsDepthRenderingSupported(internalformat, context) &&
10072 !gl::IsStencilRenderingSupported(internalformat, context))
10073 {
10074 return gl::error(GL_INVALID_ENUM);
10075 }
10076
10077 if (target != GL_RENDERBUFFER)
10078 {
10079 return gl::error(GL_INVALID_ENUM);
10080 }
10081
10082 if (bufSize < 0)
10083 {
10084 return gl::error(GL_INVALID_VALUE);
10085 }
10086
10087 switch (pname)
10088 {
10089 case GL_NUM_SAMPLE_COUNTS:
10090 if (bufSize != 0)
10091 *params = context->getNumSampleCounts(internalformat);
10092 break;
10093 case GL_SAMPLES:
10094 context->getSampleCounts(internalformat, bufSize, params);
10095 break;
10096 default:
10097 return gl::error(GL_INVALID_ENUM);
10098 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010100 }
10101 catch(std::bad_alloc&)
10102 {
10103 return gl::error(GL_OUT_OF_MEMORY);
10104 }
10105}
10106
10107// Extension functions
10108
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010109void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10110 GLbitfield mask, GLenum filter)
10111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010112 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010113 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10114 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10115 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10116
10117 try
10118 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010119 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010120
10121 if (context)
10122 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010123 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010124 dstX0, dstY0, dstX1, dstY1, mask, filter,
10125 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010126 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010127 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010128 }
10129
Geoff Lang758d5b22013-06-11 11:42:50 -040010130 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10131 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010132 }
10133 }
10134 catch(std::bad_alloc&)
10135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010136 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010137 }
10138}
10139
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010140void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10141 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010142{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010143 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010144 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010145 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010146 target, level, internalformat, width, height, depth, border, format, type, pixels);
10147
10148 try
10149 {
10150 UNIMPLEMENTED(); // FIXME
10151 }
10152 catch(std::bad_alloc&)
10153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010155 }
10156}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010157
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010158void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10159 GLenum *binaryFormat, void *binary)
10160{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010161 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 +000010162 program, bufSize, length, binaryFormat, binary);
10163
10164 try
10165 {
10166 gl::Context *context = gl::getNonLostContext();
10167
10168 if (context)
10169 {
10170 gl::Program *programObject = context->getProgram(program);
10171
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010172 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010174 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010175 }
10176
10177 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10178
10179 if (!programBinary)
10180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010181 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010182 }
10183
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010184 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010186 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010187 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010188
10189 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010190 }
10191 }
10192 catch(std::bad_alloc&)
10193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010194 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010195 }
10196}
10197
10198void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10199 const void *binary, GLint length)
10200{
10201 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10202 program, binaryFormat, binary, length);
10203
10204 try
10205 {
10206 gl::Context *context = gl::getNonLostContext();
10207
10208 if (context)
10209 {
10210 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010212 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010213 }
10214
10215 gl::Program *programObject = context->getProgram(program);
10216
10217 if (!programObject)
10218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010219 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010220 }
10221
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010222 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010223 }
10224 }
10225 catch(std::bad_alloc&)
10226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010227 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010228 }
10229}
10230
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010231void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10232{
10233 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10234
10235 try
10236 {
10237 gl::Context *context = gl::getNonLostContext();
10238
10239 if (context)
10240 {
10241 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10242 {
10243 return gl::error(GL_INVALID_VALUE);
10244 }
10245
10246 if (context->getDrawFramebufferHandle() == 0)
10247 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010248 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010249 {
10250 return gl::error(GL_INVALID_OPERATION);
10251 }
10252
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010253 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010254 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010255 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010256 }
10257 }
10258 else
10259 {
10260 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10261 {
10262 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10263 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10264 {
10265 return gl::error(GL_INVALID_OPERATION);
10266 }
10267 }
10268 }
10269
10270 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10271
10272 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10273 {
10274 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10275 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010276
10277 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10278 {
10279 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10280 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010281 }
10282 }
10283 catch (std::bad_alloc&)
10284 {
10285 return gl::error(GL_OUT_OF_MEMORY);
10286 }
10287}
10288
Shannon Woodsb3801742014-03-27 14:59:19 -040010289void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
10290{
10291 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
10292
10293 try
10294 {
10295 gl::Context *context = gl::getNonLostContext();
10296
10297 if (context)
10298 {
10299 if (!context->supportsPBOs())
10300 {
10301 return gl::error(GL_INVALID_OPERATION);
10302 }
10303
10304 if (!gl::ValidBufferTarget(context, target))
10305 {
10306 return gl::error(GL_INVALID_ENUM);
10307 }
10308
10309 if (pname != GL_BUFFER_MAP_POINTER)
10310 {
10311 return gl::error(GL_INVALID_ENUM);
10312 }
10313
10314 gl::Buffer *buffer = context->getTargetBuffer(target);
10315
10316 if (!buffer || !buffer->mapped())
10317 {
10318 *params = NULL;
10319 }
10320
10321 *params = buffer->mapPointer();
10322 }
10323 }
10324 catch (std::bad_alloc&)
10325 {
10326 return gl::error(GL_OUT_OF_MEMORY);
10327 }
10328}
10329
10330void * __stdcall glMapBufferOES(GLenum target, GLenum access)
10331{
10332 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
10333
10334 try
10335 {
10336 gl::Context *context = gl::getNonLostContext();
10337
10338 if (context)
10339 {
10340 if (!gl::ValidBufferTarget(context, target))
10341 {
10342 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10343 }
10344
10345 gl::Buffer *buffer = context->getTargetBuffer(target);
10346
10347 if (buffer == NULL)
10348 {
10349 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10350 }
10351
10352 if (access != GL_WRITE_ONLY_OES)
10353 {
10354 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10355 }
10356
10357 if (buffer->mapped())
10358 {
10359 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10360 }
10361
10362 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10363 }
10364 }
10365 catch(std::bad_alloc&)
10366 {
10367 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10368 }
10369
10370 return NULL;
10371}
10372
10373GLboolean __stdcall glUnmapBufferOES(GLenum target)
10374{
10375 EVENT("(GLenum target = 0x%X)", target);
10376
10377 try
10378 {
10379 gl::Context *context = gl::getNonLostContext();
10380
10381 if (context)
10382 {
10383 if (!gl::ValidBufferTarget(context, target))
10384 {
10385 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10386 }
10387
10388 gl::Buffer *buffer = context->getTargetBuffer(target);
10389
10390 if (buffer == NULL || !buffer->mapped())
10391 {
10392 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10393 }
10394
10395 // TODO: detect if we had corruption. if so, throw an error and return false.
10396
10397 buffer->unmap();
10398
10399 return GL_TRUE;
10400 }
10401 }
10402 catch(std::bad_alloc&)
10403 {
10404 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10405 }
10406
10407 return GL_FALSE;
10408}
10409
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010410__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10411{
10412 struct Extension
10413 {
10414 const char *name;
10415 __eglMustCastToProperFunctionPointerType address;
10416 };
10417
10418 static const Extension glExtensions[] =
10419 {
10420 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010421 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010422 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010423 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10424 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10425 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10426 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10427 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10428 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10429 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010430 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010431 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010432 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10433 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10434 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10435 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010436 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10437 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10438 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10439 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10440 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10441 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10442 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010443 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010444 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10445 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10446 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010447 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010448 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10449 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10450 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
10451 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010452
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010453 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010454 {
10455 if (strcmp(procname, glExtensions[ext].name) == 0)
10456 {
10457 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10458 }
10459 }
10460
10461 return NULL;
10462}
10463
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010464// Non-public functions used by EGL
10465
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010466bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010467{
10468 EVENT("(egl::Surface* surface = 0x%0.8p)",
10469 surface);
10470
10471 try
10472 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010473 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010474
10475 if (context)
10476 {
10477 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010478 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010479
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010480 if (textureObject->isImmutable())
10481 {
10482 return false;
10483 }
10484
Geoff Lang32d508e2014-02-11 09:39:48 -050010485 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010486 }
10487 }
10488 catch(std::bad_alloc&)
10489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010490 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010491 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010492
10493 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010494}
10495
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010496}