blob: 8e2c42e2b6853ea9703f927c95b21f8f43d56127 [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
Geoff Lang876dc722014-05-01 17:10:24 -0400647 // Check for possible overflow of size + offset
648 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
649 {
650 return gl::error(GL_OUT_OF_MEMORY);
651 }
652
653 if (size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000655 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000656 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000657
658 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000659 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000660 }
661 catch(std::bad_alloc&)
662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000663 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664 }
665}
666
667GLenum __stdcall glCheckFramebufferStatus(GLenum target)
668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000669 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670
671 try
672 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500673 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000675 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000676 }
677
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679
680 if (context)
681 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500682 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
683 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 return framebuffer->completeness();
685 }
686 }
687 catch(std::bad_alloc&)
688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000689 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000690 }
691
692 return 0;
693}
694
695void __stdcall glClear(GLbitfield mask)
696{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000697 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698
699 try
700 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000701 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000702
703 if (context)
704 {
Geoff Lang0b833232013-08-21 10:13:29 -0400705 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
706
707 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
708 {
709 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
710 }
711
712 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
713 {
714 return gl::error(GL_INVALID_VALUE);
715 }
716
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 context->clear(mask);
718 }
719 }
720 catch(std::bad_alloc&)
721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000722 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000723 }
724}
725
726void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
727{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000728 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000729 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000730
731 try
732 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000734
735 if (context)
736 {
737 context->setClearColor(red, green, blue, alpha);
738 }
739 }
740 catch(std::bad_alloc&)
741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743 }
744}
745
746void __stdcall glClearDepthf(GLclampf depth)
747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000748 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000749
750 try
751 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753
754 if (context)
755 {
756 context->setClearDepth(depth);
757 }
758 }
759 catch(std::bad_alloc&)
760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762 }
763}
764
765void __stdcall glClearStencil(GLint s)
766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000767 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768
769 try
770 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000772
773 if (context)
774 {
775 context->setClearStencil(s);
776 }
777 }
778 catch(std::bad_alloc&)
779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000780 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000781 }
782}
783
784void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
785{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000786 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000787 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000788
789 try
790 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000792
793 if (context)
794 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000795 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 }
797 }
798 catch(std::bad_alloc&)
799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801 }
802}
803
804void __stdcall glCompileShader(GLuint shader)
805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000806 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000807
808 try
809 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000810 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811
812 if (context)
813 {
814 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000815
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000816 if (!shaderObject)
817 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000818 if (context->getProgram(shader))
819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000820 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000821 }
822 else
823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000826 }
827
828 shaderObject->compile();
829 }
830 }
831 catch(std::bad_alloc&)
832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834 }
835}
836
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000837void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
838 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000839{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000840 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000841 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000842 target, level, internalformat, width, height, border, imageSize, data);
843
844 try
845 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000846 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000847
848 if (context)
849 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000850 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400851 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000852 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
853 {
854 return;
855 }
856
857 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400858 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400859 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000860 {
861 return;
862 }
863
864 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000866 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000867 }
868
869 switch (target)
870 {
871 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000873 gl::Texture2D *texture = context->getTexture2D();
874 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000875 }
876 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000877
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000878 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
879 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
880 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
881 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
882 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
883 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000885 gl::TextureCubeMap *texture = context->getTextureCubeMap();
886 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000887 }
888 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000889
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000892 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000893 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000894 }
895 catch(std::bad_alloc&)
896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000897 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898 }
899}
900
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000901void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
902 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000904 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000905 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000906 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907 target, level, xoffset, yoffset, width, height, format, imageSize, data);
908
909 try
910 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000912
913 if (context)
914 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000915 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400916 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000917 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
918 {
919 return;
920 }
921
922 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400923 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400924 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000925 {
926 return;
927 }
928
929 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000931 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000932 }
933
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000934 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000935 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000936 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000937 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000938 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000939 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000940 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000941 break;
942
943 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
944 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
945 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
946 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
947 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
948 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000949 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000950 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000951 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000952 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000953 break;
954
955 default:
956 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000957 }
958 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959 }
960 catch(std::bad_alloc&)
961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000962 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000963 }
964}
965
966void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
967{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000968 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000969 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000970 target, level, internalformat, x, y, width, height, border);
971
972 try
973 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000974 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000975
976 if (context)
977 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000978 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400979 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000980 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000981 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000982 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000983 }
984
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000985 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400986 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000987 0, 0, 0, x, y, width, height, border))
988 {
989 return;
990 }
991
992 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
993
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 switch (target)
995 {
996 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000998 gl::Texture2D *texture = context->getTexture2D();
999 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001000 }
1001 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001002
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1004 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1005 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1006 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1007 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1008 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001009 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001010 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1011 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001012 }
1013 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001014
1015 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001017 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001019 }
1020 catch(std::bad_alloc&)
1021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001023 }
1024}
1025
1026void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001028 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001029 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001030 target, level, xoffset, yoffset, x, y, width, height);
1031
1032 try
1033 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001034 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001035
1036 if (context)
1037 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001038 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001039 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001040 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001041 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001042 return;
1043 }
1044
1045 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001046 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001047 xoffset, yoffset, 0, x, y, width, height, 0))
1048 {
1049 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001050 }
1051
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001052 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001053
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001054 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001055 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001057 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001058 gl::Texture2D *texture = context->getTexture2D();
1059 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001060 }
1061 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001062
1063 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1064 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1065 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1066 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1067 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1068 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001069 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1071 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001072 }
1073 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001074
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001075 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001076 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001077 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001078 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001080
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 catch(std::bad_alloc&)
1082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001083 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084 }
1085}
1086
1087GLuint __stdcall glCreateProgram(void)
1088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001089 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001090
1091 try
1092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001094
1095 if (context)
1096 {
1097 return context->createProgram();
1098 }
1099 }
1100 catch(std::bad_alloc&)
1101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001102 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001103 }
1104
1105 return 0;
1106}
1107
1108GLuint __stdcall glCreateShader(GLenum type)
1109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001110 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111
1112 try
1113 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001114 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001115
1116 if (context)
1117 {
1118 switch (type)
1119 {
1120 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001121 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001122 return context->createShader(type);
1123 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126 }
1127 }
1128 catch(std::bad_alloc&)
1129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001130 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001131 }
1132
1133 return 0;
1134}
1135
1136void __stdcall glCullFace(GLenum mode)
1137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001138 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001139
1140 try
1141 {
1142 switch (mode)
1143 {
1144 case GL_FRONT:
1145 case GL_BACK:
1146 case GL_FRONT_AND_BACK:
1147 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001148 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001149
1150 if (context)
1151 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001152 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 }
1154 }
1155 break;
1156 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 }
1159 }
1160 catch(std::bad_alloc&)
1161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163 }
1164}
1165
1166void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1167{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001168 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169
1170 try
1171 {
1172 if (n < 0)
1173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 }
1176
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001178
1179 if (context)
1180 {
1181 for (int i = 0; i < n; i++)
1182 {
1183 context->deleteBuffer(buffers[i]);
1184 }
1185 }
1186 }
1187 catch(std::bad_alloc&)
1188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001189 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001190 }
1191}
1192
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001193void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001195 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001196
1197 try
1198 {
1199 if (n < 0)
1200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001201 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001202 }
1203
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001204 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001205
1206 if (context)
1207 {
1208 for (int i = 0; i < n; i++)
1209 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001210 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001211 }
1212 }
1213 }
1214 catch(std::bad_alloc&)
1215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001216 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001217 }
1218}
1219
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001220void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1221{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001222 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001223
1224 try
1225 {
1226 if (n < 0)
1227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001228 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229 }
1230
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001231 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001232
1233 if (context)
1234 {
1235 for (int i = 0; i < n; i++)
1236 {
1237 if (framebuffers[i] != 0)
1238 {
1239 context->deleteFramebuffer(framebuffers[i]);
1240 }
1241 }
1242 }
1243 }
1244 catch(std::bad_alloc&)
1245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247 }
1248}
1249
1250void __stdcall glDeleteProgram(GLuint program)
1251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001252 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253
1254 try
1255 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001256 if (program == 0)
1257 {
1258 return;
1259 }
1260
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001262
1263 if (context)
1264 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001265 if (!context->getProgram(program))
1266 {
1267 if(context->getShader(program))
1268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001269 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001270 }
1271 else
1272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001274 }
1275 }
1276
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 context->deleteProgram(program);
1278 }
1279 }
1280 catch(std::bad_alloc&)
1281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001283 }
1284}
1285
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001286void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1287{
1288 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1289
1290 try
1291 {
1292 if (n < 0)
1293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001294 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001295 }
1296
1297 gl::Context *context = gl::getNonLostContext();
1298
1299 if (context)
1300 {
1301 for (int i = 0; i < n; i++)
1302 {
1303 context->deleteQuery(ids[i]);
1304 }
1305 }
1306 }
1307 catch(std::bad_alloc&)
1308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001310 }
1311}
1312
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001313void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001315 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001316
1317 try
1318 {
1319 if (n < 0)
1320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001322 }
1323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001325
1326 if (context)
1327 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001328 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001329 {
1330 context->deleteRenderbuffer(renderbuffers[i]);
1331 }
1332 }
1333 }
1334 catch(std::bad_alloc&)
1335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337 }
1338}
1339
1340void __stdcall glDeleteShader(GLuint shader)
1341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001342 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343
1344 try
1345 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001346 if (shader == 0)
1347 {
1348 return;
1349 }
1350
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001352
1353 if (context)
1354 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001355 if (!context->getShader(shader))
1356 {
1357 if(context->getProgram(shader))
1358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001359 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001360 }
1361 else
1362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001364 }
1365 }
1366
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 context->deleteShader(shader);
1368 }
1369 }
1370 catch(std::bad_alloc&)
1371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001372 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373 }
1374}
1375
1376void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1377{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001378 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001379
1380 try
1381 {
1382 if (n < 0)
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385 }
1386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001388
1389 if (context)
1390 {
1391 for (int i = 0; i < n; i++)
1392 {
1393 if (textures[i] != 0)
1394 {
1395 context->deleteTexture(textures[i]);
1396 }
1397 }
1398 }
1399 }
1400 catch(std::bad_alloc&)
1401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001403 }
1404}
1405
1406void __stdcall glDepthFunc(GLenum func)
1407{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001408 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001409
1410 try
1411 {
1412 switch (func)
1413 {
1414 case GL_NEVER:
1415 case GL_ALWAYS:
1416 case GL_LESS:
1417 case GL_LEQUAL:
1418 case GL_EQUAL:
1419 case GL_GREATER:
1420 case GL_GEQUAL:
1421 case GL_NOTEQUAL:
1422 break;
1423 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001424 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001425 }
1426
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001427 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001428
1429 if (context)
1430 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001431 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 }
1433 }
1434 catch(std::bad_alloc&)
1435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001436 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437 }
1438}
1439
1440void __stdcall glDepthMask(GLboolean flag)
1441{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001442 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001443
1444 try
1445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001447
1448 if (context)
1449 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001450 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451 }
1452 }
1453 catch(std::bad_alloc&)
1454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 }
1457}
1458
1459void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1460{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001461 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001462
1463 try
1464 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001465 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466
1467 if (context)
1468 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001469 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 }
1471 }
1472 catch(std::bad_alloc&)
1473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475 }
1476}
1477
1478void __stdcall glDetachShader(GLuint program, GLuint shader)
1479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001480 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481
1482 try
1483 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001484 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485
1486 if (context)
1487 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001489 gl::Program *programObject = context->getProgram(program);
1490 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001491
1492 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001493 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001494 gl::Shader *shaderByProgramHandle;
1495 shaderByProgramHandle = context->getShader(program);
1496 if (!shaderByProgramHandle)
1497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001498 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001499 }
1500 else
1501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001502 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001503 }
1504 }
1505
1506 if (!shaderObject)
1507 {
1508 gl::Program *programByShaderHandle = context->getProgram(shader);
1509 if (!programByShaderHandle)
1510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001511 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001512 }
1513 else
1514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
1518
1519 if (!programObject->detachShader(shaderObject))
1520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 }
1524 }
1525 catch(std::bad_alloc&)
1526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528 }
1529}
1530
1531void __stdcall glDisable(GLenum cap)
1532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001533 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001534
1535 try
1536 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538
1539 if (context)
1540 {
Geoff Lang0550d032014-01-30 11:29:07 -05001541 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001543 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544 }
Geoff Lang0550d032014-01-30 11:29:07 -05001545
1546 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547 }
1548 }
1549 catch(std::bad_alloc&)
1550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552 }
1553}
1554
1555void __stdcall glDisableVertexAttribArray(GLuint index)
1556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001557 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558
1559 try
1560 {
1561 if (index >= gl::MAX_VERTEX_ATTRIBS)
1562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564 }
1565
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001567
1568 if (context)
1569 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001570 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 }
1572 }
1573 catch(std::bad_alloc&)
1574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001575 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576 }
1577}
1578
1579void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001581 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582
1583 try
1584 {
1585 if (count < 0 || first < 0)
1586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001587 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001588 }
1589
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591
Jamie Madill7a5f7382014-03-05 15:01:24 -05001592 // Check for mapped buffers
1593 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1594 {
1595 return gl::error(GL_INVALID_OPERATION);
1596 }
1597
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001598 if (context)
1599 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001600 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1601 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1602 curTransformFeedback->getDrawMode() != mode)
1603 {
1604 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1605 // that does not match the current transform feedback object's draw mode (if transform feedback
1606 // is active), (3.0.2, section 2.14, pg 86)
1607 return gl::error(GL_INVALID_OPERATION);
1608 }
1609
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001610 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 }
1612 }
1613 catch(std::bad_alloc&)
1614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001615 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001616 }
1617}
1618
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001619void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1620{
1621 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1622
1623 try
1624 {
1625 if (count < 0 || first < 0 || primcount < 0)
1626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001627 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001628 }
1629
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001630 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001631 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001632 gl::Context *context = gl::getNonLostContext();
1633
Jamie Madill7a5f7382014-03-05 15:01:24 -05001634 // Check for mapped buffers
1635 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1636 {
1637 return gl::error(GL_INVALID_OPERATION);
1638 }
1639
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001640 if (context)
1641 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001642 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1643 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1644 curTransformFeedback->getDrawMode() != mode)
1645 {
1646 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1647 // that does not match the current transform feedback object's draw mode (if transform feedback
1648 // is active), (3.0.2, section 2.14, pg 86)
1649 return gl::error(GL_INVALID_OPERATION);
1650 }
1651
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001652 context->drawArrays(mode, first, count, primcount);
1653 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001654 }
1655 }
1656 catch(std::bad_alloc&)
1657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001659 }
1660}
1661
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001662void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001664 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 +00001665 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666
1667 try
1668 {
1669 if (count < 0)
1670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001671 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001672 }
1673
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675
1676 if (context)
1677 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001678 switch (type)
1679 {
1680 case GL_UNSIGNED_BYTE:
1681 case GL_UNSIGNED_SHORT:
1682 break;
1683 case GL_UNSIGNED_INT:
1684 if (!context->supports32bitIndices())
1685 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001687 }
1688 break;
1689 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001690 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001691 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001692
1693 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1694 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1695 {
1696 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1697 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1698 return gl::error(GL_INVALID_OPERATION);
1699 }
1700
Jamie Madill7a5f7382014-03-05 15:01:24 -05001701 // Check for mapped buffers
1702 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1703 {
1704 return gl::error(GL_INVALID_OPERATION);
1705 }
1706
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001707 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708 }
1709 }
1710 catch(std::bad_alloc&)
1711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713 }
1714}
1715
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001716void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1717{
1718 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1719 mode, count, type, indices, primcount);
1720
1721 try
1722 {
1723 if (count < 0 || primcount < 0)
1724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001726 }
1727
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001728 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 gl::Context *context = gl::getNonLostContext();
1731
1732 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001733 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001734 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001735 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001736 case GL_UNSIGNED_BYTE:
1737 case GL_UNSIGNED_SHORT:
1738 break;
1739 case GL_UNSIGNED_INT:
1740 if (!context->supports32bitIndices())
1741 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001743 }
1744 break;
1745 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001746 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001747 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001748
1749 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1750 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1751 {
1752 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1753 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1754 return gl::error(GL_INVALID_OPERATION);
1755 }
1756
Jamie Madill7a5f7382014-03-05 15:01:24 -05001757 // Check for mapped buffers
1758 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1759 {
1760 return gl::error(GL_INVALID_OPERATION);
1761 }
1762
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001763 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001765 }
1766 }
1767 catch(std::bad_alloc&)
1768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001769 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001770 }
1771}
1772
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001773void __stdcall glEnable(GLenum cap)
1774{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001775 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001776
1777 try
1778 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001779 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780
1781 if (context)
1782 {
Geoff Lang0550d032014-01-30 11:29:07 -05001783 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001785 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001786 }
Geoff Lang0550d032014-01-30 11:29:07 -05001787
1788 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 }
1790 }
1791 catch(std::bad_alloc&)
1792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001793 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794 }
1795}
1796
1797void __stdcall glEnableVertexAttribArray(GLuint index)
1798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001799 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800
1801 try
1802 {
1803 if (index >= gl::MAX_VERTEX_ATTRIBS)
1804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001806 }
1807
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001809
1810 if (context)
1811 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001812 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814 }
1815 catch(std::bad_alloc&)
1816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001818 }
1819}
1820
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001821void __stdcall glEndQueryEXT(GLenum target)
1822{
1823 EVENT("GLenum target = 0x%X)", target);
1824
1825 try
1826 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001827 gl::Context *context = gl::getNonLostContext();
1828
1829 if (context)
1830 {
Geoff Lang37dde692014-01-31 16:34:54 -05001831 if (!ValidQueryType(context, target))
1832 {
1833 return gl::error(GL_INVALID_ENUM);
1834 }
1835
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001836 context->endQuery(target);
1837 }
1838 }
1839 catch(std::bad_alloc&)
1840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001841 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001842 }
1843}
1844
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001845void __stdcall glFinishFenceNV(GLuint fence)
1846{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001847 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001848
1849 try
1850 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001851 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001852
1853 if (context)
1854 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001855 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001856
1857 if (fenceObject == NULL)
1858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001859 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001860 }
1861
Jamie Madillfb9a7402013-07-26 11:55:01 -04001862 if (fenceObject->isFence() != GL_TRUE)
1863 {
1864 return gl::error(GL_INVALID_OPERATION);
1865 }
1866
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001867 fenceObject->finishFence();
1868 }
1869 }
1870 catch(std::bad_alloc&)
1871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001872 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001873 }
1874}
1875
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876void __stdcall glFinish(void)
1877{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001878 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001879
1880 try
1881 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001882 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001883
1884 if (context)
1885 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001886 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001887 }
1888 }
1889 catch(std::bad_alloc&)
1890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892 }
1893}
1894
1895void __stdcall glFlush(void)
1896{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001897 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898
1899 try
1900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902
1903 if (context)
1904 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001905 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 }
1907 }
1908 catch(std::bad_alloc&)
1909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001911 }
1912}
1913
1914void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001916 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001917 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918
1919 try
1920 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001921 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001923 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924 }
1925
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001926 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001927
1928 if (context)
1929 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001930 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001931 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001932 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001933 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001935 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1936 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001937
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001938 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001939 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001940 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001941 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001942 }
1943 else
1944 {
1945 switch (attachment)
1946 {
1947 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001948 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001949 break;
1950 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001951 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001952 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001953 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001954 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1955 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001956 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001957 UNREACHABLE();
1958 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961 }
1962 }
1963 catch(std::bad_alloc&)
1964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001965 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001966 }
1967}
1968
1969void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1970{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001971 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001972 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001973
1974 try
1975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977 if (context)
1978 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001979 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001980 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
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 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001984
1985 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001986 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001987 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001988 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001989 }
1990
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001991 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001993 textarget = GL_NONE;
1994 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001995
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001996 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001997
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001998 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001999 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002000 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002001 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002002 }
2003 else
2004 {
2005 switch (attachment)
2006 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002007 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2008 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2009 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002010 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002011 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002012 }
2013 }
2014 catch(std::bad_alloc&)
2015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017 }
2018}
2019
2020void __stdcall glFrontFace(GLenum mode)
2021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002022 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002023
2024 try
2025 {
2026 switch (mode)
2027 {
2028 case GL_CW:
2029 case GL_CCW:
2030 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032
2033 if (context)
2034 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002035 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037 }
2038 break;
2039 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002040 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041 }
2042 }
2043 catch(std::bad_alloc&)
2044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002045 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046 }
2047}
2048
2049void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2050{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002051 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052
2053 try
2054 {
2055 if (n < 0)
2056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002057 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002058 }
2059
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002061
2062 if (context)
2063 {
2064 for (int i = 0; i < n; i++)
2065 {
2066 buffers[i] = context->createBuffer();
2067 }
2068 }
2069 }
2070 catch(std::bad_alloc&)
2071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073 }
2074}
2075
2076void __stdcall glGenerateMipmap(GLenum target)
2077{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002078 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079
2080 try
2081 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002083
2084 if (context)
2085 {
Jamie Madill35d15012013-10-07 10:46:37 -04002086 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002088 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002089 }
Geoff Langae4852a2013-06-05 15:00:34 -04002090
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002091 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002092
2093 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002094 {
2095 return gl::error(GL_INVALID_OPERATION);
2096 }
2097
Geoff Lang005df412013-10-16 14:12:50 -04002098 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002099
Geoff Langae4852a2013-06-05 15:00:34 -04002100 // Internally, all texture formats are sized so checking if the format
2101 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002102
2103 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2104 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2105
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002106 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2107 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002108 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2109 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002110 {
2111 return gl::error(GL_INVALID_OPERATION);
2112 }
2113
Jamie Madillc1f8b162013-10-07 10:46:38 -04002114 // Non-power of 2 ES2 check
2115 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2116 {
2117 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2118 return gl::error(GL_INVALID_OPERATION);
2119 }
2120
2121 // Cube completeness check
2122 if (target == GL_TEXTURE_CUBE_MAP)
2123 {
2124 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2125 if (!textureCube->isCubeComplete())
2126 {
2127 return gl::error(GL_INVALID_OPERATION);
2128 }
2129 }
2130
Geoff Langae4852a2013-06-05 15:00:34 -04002131 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002132 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002133 }
2134 catch(std::bad_alloc&)
2135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002136 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002137 }
2138}
2139
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002140void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002142 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002143
2144 try
2145 {
2146 if (n < 0)
2147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002148 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002149 }
2150
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002151 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002152
2153 if (context)
2154 {
2155 for (int i = 0; i < n; i++)
2156 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002157 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002158 }
2159 }
2160 }
2161 catch(std::bad_alloc&)
2162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002163 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002164 }
2165}
2166
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002169 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170
2171 try
2172 {
2173 if (n < 0)
2174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002176 }
2177
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002178 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002179
2180 if (context)
2181 {
2182 for (int i = 0; i < n; i++)
2183 {
2184 framebuffers[i] = context->createFramebuffer();
2185 }
2186 }
2187 }
2188 catch(std::bad_alloc&)
2189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002190 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002191 }
2192}
2193
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002194void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2195{
2196 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2197
2198 try
2199 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002200 gl::Context *context = gl::getNonLostContext();
2201
2202 if (context)
2203 {
Geoff Lang37dde692014-01-31 16:34:54 -05002204 if (n < 0)
2205 {
2206 return gl::error(GL_INVALID_VALUE);
2207 }
2208
2209 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002210 {
2211 ids[i] = context->createQuery();
2212 }
2213 }
2214 }
2215 catch(std::bad_alloc&)
2216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002217 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002218 }
2219}
2220
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002221void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2222{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002223 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002224
2225 try
2226 {
2227 if (n < 0)
2228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002229 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 }
2231
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002232 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002233
2234 if (context)
2235 {
2236 for (int i = 0; i < n; i++)
2237 {
2238 renderbuffers[i] = context->createRenderbuffer();
2239 }
2240 }
2241 }
2242 catch(std::bad_alloc&)
2243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002244 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245 }
2246}
2247
2248void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2249{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002250 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251
2252 try
2253 {
2254 if (n < 0)
2255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002256 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002257 }
2258
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002260
2261 if (context)
2262 {
2263 for (int i = 0; i < n; i++)
2264 {
2265 textures[i] = context->createTexture();
2266 }
2267 }
2268 }
2269 catch(std::bad_alloc&)
2270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002271 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002272 }
2273}
2274
daniel@transgaming.com85423182010-04-22 13:35:27 +00002275void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002276{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002277 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002278 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279 program, index, bufsize, length, size, type, name);
2280
2281 try
2282 {
2283 if (bufsize < 0)
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286 }
2287
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002289
2290 if (context)
2291 {
2292 gl::Program *programObject = context->getProgram(program);
2293
2294 if (!programObject)
2295 {
2296 if (context->getShader(program))
2297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002298 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002299 }
2300 else
2301 {
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
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002306 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002308 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002309 }
2310
2311 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2312 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002313 }
2314 catch(std::bad_alloc&)
2315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002316 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002317 }
2318}
2319
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002320void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002322 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002323 "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 +00002324 program, index, bufsize, length, size, type, name);
2325
2326 try
2327 {
2328 if (bufsize < 0)
2329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002331 }
2332
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002334
2335 if (context)
2336 {
2337 gl::Program *programObject = context->getProgram(program);
2338
2339 if (!programObject)
2340 {
2341 if (context->getShader(program))
2342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002343 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002344 }
2345 else
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
2351 if (index >= (GLuint)programObject->getActiveUniformCount())
2352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002354 }
2355
2356 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2357 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002358 }
2359 catch(std::bad_alloc&)
2360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362 }
2363}
2364
2365void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002367 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 +00002368 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369
2370 try
2371 {
2372 if (maxcount < 0)
2373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002374 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 }
2376
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002377 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002378
2379 if (context)
2380 {
2381 gl::Program *programObject = context->getProgram(program);
2382
2383 if (!programObject)
2384 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002385 if (context->getShader(program))
2386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002387 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002388 }
2389 else
2390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002391 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002392 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002393 }
2394
2395 return programObject->getAttachedShaders(maxcount, count, shaders);
2396 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002397 }
2398 catch(std::bad_alloc&)
2399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002400 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401 }
2402}
2403
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002404int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002406 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002407
2408 try
2409 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002411
2412 if (context)
2413 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002414
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415 gl::Program *programObject = context->getProgram(program);
2416
2417 if (!programObject)
2418 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002419 if (context->getShader(program))
2420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002421 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002422 }
2423 else
2424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002425 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002426 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427 }
2428
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002429 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002430 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002432 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002433 }
2434
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002435 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 }
2437 }
2438 catch(std::bad_alloc&)
2439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002440 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002441 }
2442
2443 return -1;
2444}
2445
2446void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2447{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002448 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449
2450 try
2451 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002452 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002453
2454 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002455 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002456 GLenum nativeType;
2457 unsigned int numParams = 0;
2458 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2459 return gl::error(GL_INVALID_ENUM);
2460
2461 // pname is valid, but there are no parameters to return
2462 if (numParams == 0)
2463 return;
2464
2465 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002466 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002467 context->getBooleanv(pname, params);
2468 }
Jamie Madill55856b12014-01-02 13:59:50 -05002469 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002470 {
Jamie Madill55856b12014-01-02 13:59:50 -05002471 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002473 }
2474 }
2475 catch(std::bad_alloc&)
2476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002477 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478 }
2479}
2480
2481void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002483 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 +00002484
2485 try
2486 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002487 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002488
2489 if (context)
2490 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002491 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002492 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002493 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002494 }
2495
Jamie Madill70656a62014-03-05 15:01:26 -05002496 if (!gl::ValidBufferParameter(context, pname))
2497 {
2498 return gl::error(GL_INVALID_ENUM);
2499 }
2500
Jamie Madill8c96d582014-03-05 15:01:23 -05002501 gl::Buffer *buffer = context->getTargetBuffer(target);
2502
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002503 if (!buffer)
2504 {
2505 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002506 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002507 }
2508
2509 switch (pname)
2510 {
2511 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002512 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002513 break;
2514 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002515 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002516 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002517 case GL_BUFFER_ACCESS_FLAGS:
2518 *params = buffer->accessFlags();
2519 break;
2520 case GL_BUFFER_MAPPED:
2521 *params = static_cast<GLint>(buffer->mapped());
2522 break;
2523 case GL_BUFFER_MAP_OFFSET:
2524 *params = gl::clampCast<GLint>(buffer->mapOffset());
2525 break;
2526 case GL_BUFFER_MAP_LENGTH:
2527 *params = gl::clampCast<GLint>(buffer->mapLength());
2528 break;
2529 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002530 }
2531 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002532 }
2533 catch(std::bad_alloc&)
2534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537}
2538
2539GLenum __stdcall glGetError(void)
2540{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002541 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542
2543 gl::Context *context = gl::getContext();
2544
2545 if (context)
2546 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002547 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549
2550 return GL_NO_ERROR;
2551}
2552
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002553void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002555 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002556
2557 try
2558 {
2559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002560 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002561
2562 if (context)
2563 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002564 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002565
2566 if (fenceObject == NULL)
2567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002568 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002569 }
2570
Jamie Madillfb9a7402013-07-26 11:55:01 -04002571 if (fenceObject->isFence() != GL_TRUE)
2572 {
2573 return gl::error(GL_INVALID_OPERATION);
2574 }
2575
2576 switch (pname)
2577 {
2578 case GL_FENCE_STATUS_NV:
2579 case GL_FENCE_CONDITION_NV:
2580 break;
2581
2582 default: return gl::error(GL_INVALID_ENUM);
2583 }
2584
2585 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002586 }
2587 }
2588 catch(std::bad_alloc&)
2589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002590 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002591 }
2592}
2593
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002594void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002596 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002597
2598 try
2599 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002601
2602 if (context)
2603 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002604 GLenum nativeType;
2605 unsigned int numParams = 0;
2606 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2607 return gl::error(GL_INVALID_ENUM);
2608
2609 // pname is valid, but that there are no parameters to return.
2610 if (numParams == 0)
2611 return;
2612
2613 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002614 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002615 context->getFloatv(pname, params);
2616 }
Jamie Madill55856b12014-01-02 13:59:50 -05002617 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002618 {
Jamie Madill55856b12014-01-02 13:59:50 -05002619 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002620 }
2621 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002622 }
2623 catch(std::bad_alloc&)
2624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002626 }
2627}
2628
2629void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2630{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002631 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 +00002632 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633
2634 try
2635 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637
2638 if (context)
2639 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002640 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002643 }
2644
Geoff Lang646559f2013-08-15 11:08:15 -04002645 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002646 {
Geoff Lang646559f2013-08-15 11:08:15 -04002647 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2649 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2650 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2651 break;
2652 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2653 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2654 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2655 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2656 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2657 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2658 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2659 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2660 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2661 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002662 {
Geoff Lang646559f2013-08-15 11:08:15 -04002663 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002664 }
Geoff Lang646559f2013-08-15 11:08:15 -04002665 default:
2666 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002667 }
Geoff Lang646559f2013-08-15 11:08:15 -04002668
2669 // Determine if the attachment is a valid enum
2670 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002671 {
Geoff Lang646559f2013-08-15 11:08:15 -04002672 case GL_BACK:
2673 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002674 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002675 case GL_STENCIL:
2676 case GL_DEPTH_STENCIL_ATTACHMENT:
2677 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002678 {
Geoff Lang646559f2013-08-15 11:08:15 -04002679 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002680 }
Geoff Lang646559f2013-08-15 11:08:15 -04002681 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002682
Geoff Lang646559f2013-08-15 11:08:15 -04002683 case GL_DEPTH_ATTACHMENT:
2684 case GL_STENCIL_ATTACHMENT:
2685 break;
2686
2687 default:
2688 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2689 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2690 {
2691 return gl::error(GL_INVALID_ENUM);
2692 }
2693 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002694 }
2695
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002696 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2697 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002698 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2699
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002700 GLenum attachmentType;
2701 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002702 GLuint attachmentLevel;
2703 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002704 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002705
Geoff Lang646559f2013-08-15 11:08:15 -04002706 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002707 {
Geoff Lang646559f2013-08-15 11:08:15 -04002708 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002709 {
Geoff Lang646559f2013-08-15 11:08:15 -04002710 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002711 }
2712
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002713 switch (attachment)
2714 {
Geoff Lang646559f2013-08-15 11:08:15 -04002715 case GL_BACK:
2716 attachmentType = framebuffer->getColorbufferType(0);
2717 attachmentHandle = framebuffer->getColorbufferHandle(0);
2718 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2719 attachmentLayer = framebuffer->getColorbufferLayer(0);
2720 renderbuffer = framebuffer->getColorbuffer(0);
2721 break;
2722 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002723 attachmentType = framebuffer->getDepthbufferType();
2724 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002725 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2726 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002727 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002728 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002729 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002730 attachmentType = framebuffer->getStencilbufferType();
2731 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002732 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2733 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002734 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002735 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002736 default:
2737 return gl::error(GL_INVALID_OPERATION);
2738 }
2739 }
2740 else
2741 {
2742 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2743 {
2744 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2745 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2746 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2747 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2748 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2749 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2750 }
2751 else
2752 {
2753 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002754 {
Geoff Lang646559f2013-08-15 11:08:15 -04002755 case GL_DEPTH_ATTACHMENT:
2756 attachmentType = framebuffer->getDepthbufferType();
2757 attachmentHandle = framebuffer->getDepthbufferHandle();
2758 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2759 attachmentLayer = framebuffer->getDepthbufferLayer();
2760 renderbuffer = framebuffer->getDepthbuffer();
2761 break;
2762 case GL_STENCIL_ATTACHMENT:
2763 attachmentType = framebuffer->getStencilbufferType();
2764 attachmentHandle = framebuffer->getStencilbufferHandle();
2765 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2766 attachmentLayer = framebuffer->getStencilbufferLayer();
2767 renderbuffer = framebuffer->getStencilbuffer();
2768 break;
2769 case GL_DEPTH_STENCIL_ATTACHMENT:
2770 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2771 {
2772 return gl::error(GL_INVALID_OPERATION);
2773 }
2774 attachmentType = framebuffer->getDepthStencilbufferType();
2775 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2776 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2777 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2778 renderbuffer = framebuffer->getDepthStencilBuffer();
2779 break;
2780 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002781 return gl::error(GL_INVALID_OPERATION);
2782 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002783 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002784 }
2785
2786 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002787 if (framebufferHandle == 0)
2788 {
2789 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2790 }
2791 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002792 {
2793 attachmentObjectType = attachmentType;
2794 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002795 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002796 {
2797 attachmentObjectType = GL_TEXTURE;
2798 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002799 else
2800 {
2801 UNREACHABLE();
2802 return;
2803 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002804
Geoff Lang646559f2013-08-15 11:08:15 -04002805 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002806 {
Geoff Lang646559f2013-08-15 11:08:15 -04002807 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2808 // is NONE, then querying any other pname will generate INVALID_ENUM.
2809
2810 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2811 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2812 // INVALID_OPERATION for all other pnames
2813
2814 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002815 {
Geoff Lang646559f2013-08-15 11:08:15 -04002816 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2817 *params = attachmentObjectType;
2818 break;
2819
2820 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2821 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002822 {
Geoff Lang646559f2013-08-15 11:08:15 -04002823 return gl::error(GL_INVALID_ENUM);
2824 }
2825 *params = 0;
2826 break;
2827
2828 default:
2829 if (context->getClientVersion() < 3)
2830 {
2831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002832 }
2833 else
2834 {
Geoff Lang646559f2013-08-15 11:08:15 -04002835 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002836 }
2837 }
Geoff Lang646559f2013-08-15 11:08:15 -04002838 }
2839 else
2840 {
2841 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2842 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2843 ASSERT(renderbuffer != NULL);
2844
2845 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002846 {
Geoff Lang646559f2013-08-15 11:08:15 -04002847 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2848 *params = attachmentObjectType;
2849 break;
2850
2851 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2852 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2853 {
2854 return gl::error(GL_INVALID_ENUM);
2855 }
2856 *params = attachmentHandle;
2857 break;
2858
2859 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2860 if (attachmentObjectType != GL_TEXTURE)
2861 {
2862 return gl::error(GL_INVALID_ENUM);
2863 }
2864 *params = attachmentLevel;
2865 break;
2866
2867 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2868 if (attachmentObjectType != GL_TEXTURE)
2869 {
2870 return gl::error(GL_INVALID_ENUM);
2871 }
2872 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2873 break;
2874
2875 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2876 *params = renderbuffer->getRedSize();
2877 break;
2878
2879 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2880 *params = renderbuffer->getGreenSize();
2881 break;
2882
2883 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2884 *params = renderbuffer->getBlueSize();
2885 break;
2886
2887 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2888 *params = renderbuffer->getAlphaSize();
2889 break;
2890
2891 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2892 *params = renderbuffer->getDepthSize();
2893 break;
2894
2895 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2896 *params = renderbuffer->getStencilSize();
2897 break;
2898
2899 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2900 if (attachment == GL_DEPTH_STENCIL)
2901 {
2902 gl::error(GL_INVALID_OPERATION);
2903 }
2904 *params = renderbuffer->getComponentType();
2905 break;
2906
2907 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2908 *params = renderbuffer->getColorEncoding();
2909 break;
2910
2911 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2912 if (attachmentObjectType != GL_TEXTURE)
2913 {
2914 return gl::error(GL_INVALID_ENUM);
2915 }
2916 *params = attachmentLayer;
2917 break;
2918
2919 default:
2920 UNREACHABLE();
2921 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002922 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002923 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924 }
2925 }
2926 catch(std::bad_alloc&)
2927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002928 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002929 }
2930}
2931
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002932GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2933{
2934 EVENT("()");
2935
2936 try
2937 {
2938 gl::Context *context = gl::getContext();
2939
2940 if (context)
2941 {
2942 return context->getResetStatus();
2943 }
2944
2945 return GL_NO_ERROR;
2946 }
2947 catch(std::bad_alloc&)
2948 {
2949 return GL_OUT_OF_MEMORY;
2950 }
2951}
2952
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002955 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956
2957 try
2958 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002960
2961 if (context)
2962 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002963 GLenum nativeType;
2964 unsigned int numParams = 0;
2965 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2966 return gl::error(GL_INVALID_ENUM);
2967
2968 // pname is valid, but there are no parameters to return
2969 if (numParams == 0)
2970 return;
2971
2972 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002974 context->getIntegerv(pname, params);
2975 }
Jamie Madill55856b12014-01-02 13:59:50 -05002976 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002977 {
Jamie Madill55856b12014-01-02 13:59:50 -05002978 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 }
2980 }
2981 }
2982 catch(std::bad_alloc&)
2983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002984 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985 }
2986}
2987
2988void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002990 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002991
2992 try
2993 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002995
2996 if (context)
2997 {
2998 gl::Program *programObject = context->getProgram(program);
2999
3000 if (!programObject)
3001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003002 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003 }
3004
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003005 if (context->getClientVersion() < 3)
3006 {
3007 switch (pname)
3008 {
3009 case GL_ACTIVE_UNIFORM_BLOCKS:
3010 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003011 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3012 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3013 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003014 return gl::error(GL_INVALID_ENUM);
3015 }
3016 }
3017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 switch (pname)
3019 {
3020 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003021 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022 return;
3023 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003024 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 return;
3026 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003027 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 return;
3029 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003030 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 return;
3032 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003033 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 return;
3035 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003036 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 return;
3038 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003039 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040 return;
3041 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003042 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003043 return;
3044 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003045 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003046 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003047 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003048 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003049 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003050 case GL_ACTIVE_UNIFORM_BLOCKS:
3051 *params = programObject->getActiveUniformBlockCount();
3052 return;
3053 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3054 *params = programObject->getActiveUniformBlockMaxLength();
3055 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003056 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3057 *params = programObject->getTransformFeedbackBufferMode();
3058 break;
3059 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3060 *params = programObject->getTransformFeedbackVaryingCount();
3061 break;
3062 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3063 *params = programObject->getTransformFeedbackVaryingMaxLength();
3064 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003065 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 }
3068 }
3069 }
3070 catch(std::bad_alloc&)
3071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003072 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003073 }
3074}
3075
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003076void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003077{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003078 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 +00003079 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080
3081 try
3082 {
3083 if (bufsize < 0)
3084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086 }
3087
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003089
3090 if (context)
3091 {
3092 gl::Program *programObject = context->getProgram(program);
3093
3094 if (!programObject)
3095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003097 }
3098
3099 programObject->getInfoLog(bufsize, length, infolog);
3100 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101 }
3102 catch(std::bad_alloc&)
3103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105 }
3106}
3107
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003108void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3109{
3110 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3111
3112 try
3113 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003114 gl::Context *context = gl::getNonLostContext();
3115
3116 if (context)
3117 {
Geoff Lang37dde692014-01-31 16:34:54 -05003118 if (!ValidQueryType(context, target))
3119 {
3120 return gl::error(GL_INVALID_ENUM);
3121 }
3122
3123 switch (pname)
3124 {
3125 case GL_CURRENT_QUERY_EXT:
3126 params[0] = context->getActiveQuery(target);
3127 break;
3128
3129 default:
3130 return gl::error(GL_INVALID_ENUM);
3131 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003132 }
3133 }
3134 catch(std::bad_alloc&)
3135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003136 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003137 }
3138}
3139
3140void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3141{
3142 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3143
3144 try
3145 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003146 gl::Context *context = gl::getNonLostContext();
3147
3148 if (context)
3149 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003150 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3151
3152 if (!queryObject)
3153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003154 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003155 }
3156
3157 if (context->getActiveQuery(queryObject->getType()) == id)
3158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003159 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003160 }
3161
3162 switch(pname)
3163 {
3164 case GL_QUERY_RESULT_EXT:
3165 params[0] = queryObject->getResult();
3166 break;
3167 case GL_QUERY_RESULT_AVAILABLE_EXT:
3168 params[0] = queryObject->isResultAvailable();
3169 break;
3170 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003171 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003172 }
3173 }
3174 }
3175 catch(std::bad_alloc&)
3176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003177 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003178 }
3179}
3180
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3182{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003183 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 +00003184
3185 try
3186 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003188
3189 if (context)
3190 {
3191 if (target != GL_RENDERBUFFER)
3192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003194 }
3195
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003196 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003198 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003199 }
3200
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003201 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003202
3203 switch (pname)
3204 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003205 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3206 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3207 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3208 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3209 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3210 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3211 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3212 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3213 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003214 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003215 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003216 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003217 *params = renderbuffer->getSamples();
3218 }
3219 else
3220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003222 }
3223 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003224 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003226 }
3227 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228 }
3229 catch(std::bad_alloc&)
3230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003231 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232 }
3233}
3234
3235void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003237 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003238
3239 try
3240 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003242
3243 if (context)
3244 {
3245 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003246
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003247 if (!shaderObject)
3248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250 }
3251
3252 switch (pname)
3253 {
3254 case GL_SHADER_TYPE:
3255 *params = shaderObject->getType();
3256 return;
3257 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003258 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 return;
3260 case GL_COMPILE_STATUS:
3261 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3262 return;
3263 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003264 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003265 return;
3266 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003267 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003269 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3270 *params = shaderObject->getTranslatedSourceLength();
3271 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003272 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275 }
3276 }
3277 catch(std::bad_alloc&)
3278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 }
3281}
3282
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003283void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003285 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 +00003286 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287
3288 try
3289 {
3290 if (bufsize < 0)
3291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003293 }
3294
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003295 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003296
3297 if (context)
3298 {
3299 gl::Shader *shaderObject = context->getShader(shader);
3300
3301 if (!shaderObject)
3302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003304 }
3305
3306 shaderObject->getInfoLog(bufsize, length, infolog);
3307 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308 }
3309 catch(std::bad_alloc&)
3310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312 }
3313}
3314
3315void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3316{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003317 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 +00003318 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003319
3320 try
3321 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003322 switch (shadertype)
3323 {
3324 case GL_VERTEX_SHADER:
3325 case GL_FRAGMENT_SHADER:
3326 break;
3327 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003328 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003329 }
3330
3331 switch (precisiontype)
3332 {
3333 case GL_LOW_FLOAT:
3334 case GL_MEDIUM_FLOAT:
3335 case GL_HIGH_FLOAT:
3336 // Assume IEEE 754 precision
3337 range[0] = 127;
3338 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003339 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003340 break;
3341 case GL_LOW_INT:
3342 case GL_MEDIUM_INT:
3343 case GL_HIGH_INT:
3344 // Some (most) hardware only supports single-precision floating-point numbers,
3345 // which can accurately represent integers up to +/-16777216
3346 range[0] = 24;
3347 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003348 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003349 break;
3350 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003351 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003353 }
3354 catch(std::bad_alloc&)
3355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 }
3358}
3359
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003360void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003362 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 +00003363 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364
3365 try
3366 {
3367 if (bufsize < 0)
3368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003370 }
3371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003373
3374 if (context)
3375 {
3376 gl::Shader *shaderObject = context->getShader(shader);
3377
3378 if (!shaderObject)
3379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003380 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003381 }
3382
3383 shaderObject->getSource(bufsize, length, source);
3384 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385 }
3386 catch(std::bad_alloc&)
3387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003388 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389 }
3390}
3391
zmo@google.coma574f782011-10-03 21:45:23 +00003392void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3393{
3394 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3395 shader, bufsize, length, source);
3396
3397 try
3398 {
3399 if (bufsize < 0)
3400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003401 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003402 }
3403
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003404 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003405
3406 if (context)
3407 {
3408 gl::Shader *shaderObject = context->getShader(shader);
3409
3410 if (!shaderObject)
3411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003412 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003413 }
3414
3415 shaderObject->getTranslatedSource(bufsize, length, source);
3416 }
3417 }
3418 catch(std::bad_alloc&)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003421 }
3422}
3423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424const GLubyte* __stdcall glGetString(GLenum name)
3425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003426 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427
3428 try
3429 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003430 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003431
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 switch (name)
3433 {
3434 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003435 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003437 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003439 if (context->getClientVersion() == 2)
3440 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003441 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 }
3443 else
3444 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003445 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003446 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003448 if (context->getClientVersion() == 2)
3449 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003450 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003451 }
3452 else
3453 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003454 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003455 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003457 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003458 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003459 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 }
3461 }
3462 catch(std::bad_alloc&)
3463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003464 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003465 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466}
3467
3468void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003470 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 +00003471
3472 try
3473 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003474 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003475
3476 if (context)
3477 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003478 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003479
Jamie Madillfb8a8302013-07-03 14:24:12 -04003480 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003482 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003483 }
3484
3485 switch (pname)
3486 {
3487 case GL_TEXTURE_MAG_FILTER:
3488 *params = (GLfloat)texture->getMagFilter();
3489 break;
3490 case GL_TEXTURE_MIN_FILTER:
3491 *params = (GLfloat)texture->getMinFilter();
3492 break;
3493 case GL_TEXTURE_WRAP_S:
3494 *params = (GLfloat)texture->getWrapS();
3495 break;
3496 case GL_TEXTURE_WRAP_T:
3497 *params = (GLfloat)texture->getWrapT();
3498 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003499 case GL_TEXTURE_WRAP_R:
3500 if (context->getClientVersion() < 3)
3501 {
3502 return gl::error(GL_INVALID_ENUM);
3503 }
3504 *params = (GLfloat)texture->getWrapR();
3505 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003506 case GL_TEXTURE_IMMUTABLE_FORMAT:
3507 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003508 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3509 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003510 case GL_TEXTURE_IMMUTABLE_LEVELS:
3511 if (context->getClientVersion() < 3)
3512 {
3513 return gl::error(GL_INVALID_ENUM);
3514 }
Jamie Madill51a94372013-10-24 17:49:43 -04003515 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003516 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003517 case GL_TEXTURE_USAGE_ANGLE:
3518 *params = (GLfloat)texture->getUsage();
3519 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003520 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3521 if (!context->supportsTextureFilterAnisotropy())
3522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003524 }
3525 *params = (GLfloat)texture->getMaxAnisotropy();
3526 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003527 case GL_TEXTURE_SWIZZLE_R:
3528 if (context->getClientVersion() < 3)
3529 {
3530 return gl::error(GL_INVALID_ENUM);
3531 }
3532 *params = (GLfloat)texture->getSwizzleRed();
3533 break;
3534 case GL_TEXTURE_SWIZZLE_G:
3535 if (context->getClientVersion() < 3)
3536 {
3537 return gl::error(GL_INVALID_ENUM);
3538 }
3539 *params = (GLfloat)texture->getSwizzleGreen();
3540 break;
3541 case GL_TEXTURE_SWIZZLE_B:
3542 if (context->getClientVersion() < 3)
3543 {
3544 return gl::error(GL_INVALID_ENUM);
3545 }
3546 *params = (GLfloat)texture->getSwizzleBlue();
3547 break;
3548 case GL_TEXTURE_SWIZZLE_A:
3549 if (context->getClientVersion() < 3)
3550 {
3551 return gl::error(GL_INVALID_ENUM);
3552 }
3553 *params = (GLfloat)texture->getSwizzleAlpha();
3554 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003555 case GL_TEXTURE_BASE_LEVEL:
3556 if (context->getClientVersion() < 3)
3557 {
3558 return gl::error(GL_INVALID_ENUM);
3559 }
3560 *params = (GLfloat)texture->getBaseLevel();
3561 break;
3562 case GL_TEXTURE_MAX_LEVEL:
3563 if (context->getClientVersion() < 3)
3564 {
3565 return gl::error(GL_INVALID_ENUM);
3566 }
3567 *params = (GLfloat)texture->getMaxLevel();
3568 break;
3569 case GL_TEXTURE_MIN_LOD:
3570 if (context->getClientVersion() < 3)
3571 {
3572 return gl::error(GL_INVALID_ENUM);
3573 }
3574 *params = texture->getMinLod();
3575 break;
3576 case GL_TEXTURE_MAX_LOD:
3577 if (context->getClientVersion() < 3)
3578 {
3579 return gl::error(GL_INVALID_ENUM);
3580 }
3581 *params = texture->getMaxLod();
3582 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003583 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003584 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003585 }
3586 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003587 }
3588 catch(std::bad_alloc&)
3589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003590 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003591 }
3592}
3593
3594void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003596 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 +00003597
3598 try
3599 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003601
3602 if (context)
3603 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003604 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003605
Jamie Madillfb8a8302013-07-03 14:24:12 -04003606 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003608 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003609 }
3610
3611 switch (pname)
3612 {
3613 case GL_TEXTURE_MAG_FILTER:
3614 *params = texture->getMagFilter();
3615 break;
3616 case GL_TEXTURE_MIN_FILTER:
3617 *params = texture->getMinFilter();
3618 break;
3619 case GL_TEXTURE_WRAP_S:
3620 *params = texture->getWrapS();
3621 break;
3622 case GL_TEXTURE_WRAP_T:
3623 *params = texture->getWrapT();
3624 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003625 case GL_TEXTURE_WRAP_R:
3626 if (context->getClientVersion() < 3)
3627 {
3628 return gl::error(GL_INVALID_ENUM);
3629 }
3630 *params = texture->getWrapR();
3631 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003632 case GL_TEXTURE_IMMUTABLE_FORMAT:
3633 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003634 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3635 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003636 case GL_TEXTURE_IMMUTABLE_LEVELS:
3637 if (context->getClientVersion() < 3)
3638 {
3639 return gl::error(GL_INVALID_ENUM);
3640 }
Jamie Madill51a94372013-10-24 17:49:43 -04003641 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003642 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003643 case GL_TEXTURE_USAGE_ANGLE:
3644 *params = texture->getUsage();
3645 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003646 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3647 if (!context->supportsTextureFilterAnisotropy())
3648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003650 }
3651 *params = (GLint)texture->getMaxAnisotropy();
3652 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003653 case GL_TEXTURE_SWIZZLE_R:
3654 if (context->getClientVersion() < 3)
3655 {
3656 return gl::error(GL_INVALID_ENUM);
3657 }
3658 *params = texture->getSwizzleRed();
3659 break;
3660 case GL_TEXTURE_SWIZZLE_G:
3661 if (context->getClientVersion() < 3)
3662 {
3663 return gl::error(GL_INVALID_ENUM);
3664 }
3665 *params = texture->getSwizzleGreen();
3666 break;
3667 case GL_TEXTURE_SWIZZLE_B:
3668 if (context->getClientVersion() < 3)
3669 {
3670 return gl::error(GL_INVALID_ENUM);
3671 }
3672 *params = texture->getSwizzleBlue();
3673 break;
3674 case GL_TEXTURE_SWIZZLE_A:
3675 if (context->getClientVersion() < 3)
3676 {
3677 return gl::error(GL_INVALID_ENUM);
3678 }
3679 *params = texture->getSwizzleAlpha();
3680 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003681 case GL_TEXTURE_BASE_LEVEL:
3682 if (context->getClientVersion() < 3)
3683 {
3684 return gl::error(GL_INVALID_ENUM);
3685 }
3686 *params = texture->getBaseLevel();
3687 break;
3688 case GL_TEXTURE_MAX_LEVEL:
3689 if (context->getClientVersion() < 3)
3690 {
3691 return gl::error(GL_INVALID_ENUM);
3692 }
3693 *params = texture->getMaxLevel();
3694 break;
3695 case GL_TEXTURE_MIN_LOD:
3696 if (context->getClientVersion() < 3)
3697 {
3698 return gl::error(GL_INVALID_ENUM);
3699 }
3700 *params = (GLint)texture->getMinLod();
3701 break;
3702 case GL_TEXTURE_MAX_LOD:
3703 if (context->getClientVersion() < 3)
3704 {
3705 return gl::error(GL_INVALID_ENUM);
3706 }
3707 *params = (GLint)texture->getMaxLod();
3708 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003711 }
3712 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003713 }
3714 catch(std::bad_alloc&)
3715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003717 }
3718}
3719
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003720void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3721{
3722 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3723 program, location, bufSize, params);
3724
3725 try
3726 {
3727 if (bufSize < 0)
3728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003729 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003730 }
3731
3732 gl::Context *context = gl::getNonLostContext();
3733
3734 if (context)
3735 {
3736 if (program == 0)
3737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003738 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003739 }
3740
3741 gl::Program *programObject = context->getProgram(program);
3742
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003743 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003745 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003746 }
3747
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003748 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3749 if (!programBinary)
3750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003751 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003752 }
3753
3754 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003756 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003757 }
3758 }
3759 }
3760 catch(std::bad_alloc&)
3761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003763 }
3764}
3765
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003766void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003768 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003769
3770 try
3771 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003772 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003773
3774 if (context)
3775 {
3776 if (program == 0)
3777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003778 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003779 }
3780
3781 gl::Program *programObject = context->getProgram(program);
3782
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003783 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003785 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003786 }
3787
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003788 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3789 if (!programBinary)
3790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003791 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003792 }
3793
3794 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003797 }
3798 }
3799 }
3800 catch(std::bad_alloc&)
3801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003803 }
3804}
3805
3806void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3807{
3808 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3809 program, location, bufSize, params);
3810
3811 try
3812 {
3813 if (bufSize < 0)
3814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003816 }
3817
3818 gl::Context *context = gl::getNonLostContext();
3819
3820 if (context)
3821 {
3822 if (program == 0)
3823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003825 }
3826
3827 gl::Program *programObject = context->getProgram(program);
3828
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003829 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003831 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003832 }
3833
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003834 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3835 if (!programBinary)
3836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003837 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003838 }
3839
3840 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003842 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003843 }
3844 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003845 }
3846 catch(std::bad_alloc&)
3847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003849 }
3850}
3851
3852void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003854 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855
3856 try
3857 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003858 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003859
3860 if (context)
3861 {
3862 if (program == 0)
3863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003864 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003865 }
3866
3867 gl::Program *programObject = context->getProgram(program);
3868
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003869 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003872 }
3873
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003874 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3875 if (!programBinary)
3876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003877 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003878 }
3879
3880 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003882 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003883 }
3884 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885 }
3886 catch(std::bad_alloc&)
3887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003888 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889 }
3890}
3891
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003892int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003894 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003895
3896 try
3897 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003898 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003899
3900 if (strstr(name, "gl_") == name)
3901 {
3902 return -1;
3903 }
3904
3905 if (context)
3906 {
3907 gl::Program *programObject = context->getProgram(program);
3908
3909 if (!programObject)
3910 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003911 if (context->getShader(program))
3912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003913 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003914 }
3915 else
3916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003917 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003918 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003919 }
3920
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003921 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003922 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003924 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003925 }
3926
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003927 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 }
3929 }
3930 catch(std::bad_alloc&)
3931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003932 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003933 }
3934
3935 return -1;
3936}
3937
3938void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003940 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003941
3942 try
3943 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003944 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003945
daniel@transgaming.come0078962010-04-15 20:45:08 +00003946 if (context)
3947 {
3948 if (index >= gl::MAX_VERTEX_ATTRIBS)
3949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003951 }
3952
daniel@transgaming.com83921382011-01-08 05:46:00 +00003953 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003954
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003955 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003956 {
Jamie Madillaff71502013-07-02 11:57:05 -04003957 return;
3958 }
3959
3960 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3961 {
3962 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3963 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003964 {
Jamie Madillaff71502013-07-02 11:57:05 -04003965 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003966 }
Jamie Madillaff71502013-07-02 11:57:05 -04003967 }
3968 else
3969 {
3970 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003971 }
3972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973 }
3974 catch(std::bad_alloc&)
3975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977 }
3978}
3979
3980void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3981{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003982 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983
3984 try
3985 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003986 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003987
daniel@transgaming.come0078962010-04-15 20:45:08 +00003988 if (context)
3989 {
3990 if (index >= gl::MAX_VERTEX_ATTRIBS)
3991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003993 }
3994
daniel@transgaming.com83921382011-01-08 05:46:00 +00003995 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003996
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003997 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003998 {
Jamie Madillaff71502013-07-02 11:57:05 -04003999 return;
4000 }
4001
4002 if (pname == GL_CURRENT_VERTEX_ATTRIB)
4003 {
4004 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4005 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004006 {
Jamie Madillaff71502013-07-02 11:57:05 -04004007 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004008 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004009 }
Jamie Madillaff71502013-07-02 11:57:05 -04004010 }
4011 else
4012 {
4013 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004014 }
4015 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016 }
4017 catch(std::bad_alloc&)
4018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020 }
4021}
4022
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004023void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004024{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004025 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004026
4027 try
4028 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004030
daniel@transgaming.come0078962010-04-15 20:45:08 +00004031 if (context)
4032 {
4033 if (index >= gl::MAX_VERTEX_ATTRIBS)
4034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004036 }
4037
4038 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004040 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004041 }
4042
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004043 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004044 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045 }
4046 catch(std::bad_alloc&)
4047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004048 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049 }
4050}
4051
4052void __stdcall glHint(GLenum target, GLenum mode)
4053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004054 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055
4056 try
4057 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004058 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004059 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004060 case GL_FASTEST:
4061 case GL_NICEST:
4062 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004063 break;
4064 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004066 }
4067
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004068 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004069 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004070 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004071 case GL_GENERATE_MIPMAP_HINT:
4072 if (context) context->setGenerateMipmapHint(mode);
4073 break;
4074 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4075 if (context) context->setFragmentShaderDerivativeHint(mode);
4076 break;
4077 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004078 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004079 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080 }
4081 catch(std::bad_alloc&)
4082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004083 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084 }
4085}
4086
4087GLboolean __stdcall glIsBuffer(GLuint buffer)
4088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004089 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004090
4091 try
4092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094
4095 if (context && buffer)
4096 {
4097 gl::Buffer *bufferObject = context->getBuffer(buffer);
4098
4099 if (bufferObject)
4100 {
4101 return GL_TRUE;
4102 }
4103 }
4104 }
4105 catch(std::bad_alloc&)
4106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004107 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108 }
4109
4110 return GL_FALSE;
4111}
4112
4113GLboolean __stdcall glIsEnabled(GLenum cap)
4114{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004115 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116
4117 try
4118 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004119 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004120
4121 if (context)
4122 {
Geoff Lang0550d032014-01-30 11:29:07 -05004123 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126 }
Geoff Lang0550d032014-01-30 11:29:07 -05004127
4128 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129 }
4130 }
4131 catch(std::bad_alloc&)
4132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004133 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134 }
4135
4136 return false;
4137}
4138
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004139GLboolean __stdcall glIsFenceNV(GLuint fence)
4140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004141 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004142
4143 try
4144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004145 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004146
4147 if (context)
4148 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004149 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004150
4151 if (fenceObject == NULL)
4152 {
4153 return GL_FALSE;
4154 }
4155
4156 return fenceObject->isFence();
4157 }
4158 }
4159 catch(std::bad_alloc&)
4160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004161 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004162 }
4163
4164 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004165}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004166
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004167GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004169 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004170
4171 try
4172 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174
4175 if (context && framebuffer)
4176 {
4177 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4178
4179 if (framebufferObject)
4180 {
4181 return GL_TRUE;
4182 }
4183 }
4184 }
4185 catch(std::bad_alloc&)
4186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004187 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188 }
4189
4190 return GL_FALSE;
4191}
4192
4193GLboolean __stdcall glIsProgram(GLuint program)
4194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004195 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196
4197 try
4198 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004199 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200
4201 if (context && program)
4202 {
4203 gl::Program *programObject = context->getProgram(program);
4204
4205 if (programObject)
4206 {
4207 return GL_TRUE;
4208 }
4209 }
4210 }
4211 catch(std::bad_alloc&)
4212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004213 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214 }
4215
4216 return GL_FALSE;
4217}
4218
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004219GLboolean __stdcall glIsQueryEXT(GLuint id)
4220{
4221 EVENT("(GLuint id = %d)", id);
4222
4223 try
4224 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004225 gl::Context *context = gl::getNonLostContext();
4226
4227 if (context)
4228 {
Geoff Lang37dde692014-01-31 16:34:54 -05004229 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004230 }
4231 }
4232 catch(std::bad_alloc&)
4233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004234 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004235 }
4236
4237 return GL_FALSE;
4238}
4239
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004242 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243
4244 try
4245 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004246 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247
4248 if (context && renderbuffer)
4249 {
4250 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4251
4252 if (renderbufferObject)
4253 {
4254 return GL_TRUE;
4255 }
4256 }
4257 }
4258 catch(std::bad_alloc&)
4259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 }
4262
4263 return GL_FALSE;
4264}
4265
4266GLboolean __stdcall glIsShader(GLuint shader)
4267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004268 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269
4270 try
4271 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273
4274 if (context && shader)
4275 {
4276 gl::Shader *shaderObject = context->getShader(shader);
4277
4278 if (shaderObject)
4279 {
4280 return GL_TRUE;
4281 }
4282 }
4283 }
4284 catch(std::bad_alloc&)
4285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004286 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004287 }
4288
4289 return GL_FALSE;
4290}
4291
4292GLboolean __stdcall glIsTexture(GLuint texture)
4293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004294 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295
4296 try
4297 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004298 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004299
4300 if (context && texture)
4301 {
4302 gl::Texture *textureObject = context->getTexture(texture);
4303
4304 if (textureObject)
4305 {
4306 return GL_TRUE;
4307 }
4308 }
4309 }
4310 catch(std::bad_alloc&)
4311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004313 }
4314
4315 return GL_FALSE;
4316}
4317
4318void __stdcall glLineWidth(GLfloat width)
4319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004320 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321
4322 try
4323 {
4324 if (width <= 0.0f)
4325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 }
4328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004330
4331 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004333 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 }
4335 }
4336 catch(std::bad_alloc&)
4337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004338 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339 }
4340}
4341
4342void __stdcall glLinkProgram(GLuint program)
4343{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004344 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345
4346 try
4347 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004348 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349
4350 if (context)
4351 {
4352 gl::Program *programObject = context->getProgram(program);
4353
4354 if (!programObject)
4355 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004356 if (context->getShader(program))
4357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004359 }
4360 else
4361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004362 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004363 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004364 }
4365
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004366 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004367 }
4368 }
4369 catch(std::bad_alloc&)
4370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004371 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004372 }
4373}
4374
4375void __stdcall glPixelStorei(GLenum pname, GLint param)
4376{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004377 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378
4379 try
4380 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004382
4383 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004385 switch (pname)
4386 {
4387 case GL_UNPACK_ALIGNMENT:
4388 if (param != 1 && param != 2 && param != 4 && param != 8)
4389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004391 }
4392
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004393 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004394 break;
4395
4396 case GL_PACK_ALIGNMENT:
4397 if (param != 1 && param != 2 && param != 4 && param != 8)
4398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004400 }
4401
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004402 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004403 break;
4404
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004405 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4406 context->setPackReverseRowOrder(param != 0);
4407 break;
4408
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004409 case GL_UNPACK_IMAGE_HEIGHT:
4410 case GL_UNPACK_SKIP_IMAGES:
4411 case GL_UNPACK_ROW_LENGTH:
4412 case GL_UNPACK_SKIP_ROWS:
4413 case GL_UNPACK_SKIP_PIXELS:
4414 case GL_PACK_ROW_LENGTH:
4415 case GL_PACK_SKIP_ROWS:
4416 case GL_PACK_SKIP_PIXELS:
4417 if (context->getClientVersion() < 3)
4418 {
4419 return gl::error(GL_INVALID_ENUM);
4420 }
4421 UNIMPLEMENTED();
4422 break;
4423
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004424 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004425 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004426 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 }
4428 }
4429 catch(std::bad_alloc&)
4430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004432 }
4433}
4434
4435void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004437 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438
4439 try
4440 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004442
4443 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004445 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446 }
4447 }
4448 catch(std::bad_alloc&)
4449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451 }
4452}
4453
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004454void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4455 GLenum format, GLenum type, GLsizei bufSize,
4456 GLvoid *data)
4457{
4458 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4459 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4460 x, y, width, height, format, type, bufSize, data);
4461
4462 try
4463 {
4464 if (width < 0 || height < 0 || bufSize < 0)
4465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004466 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004467 }
4468
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004469 gl::Context *context = gl::getNonLostContext();
4470
4471 if (context)
4472 {
Jamie Madill26e91952014-03-05 15:01:27 -05004473 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4474 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004475 {
Jamie Madill26e91952014-03-05 15:01:27 -05004476 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004477 }
4478
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004479 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4480 }
4481 }
4482 catch(std::bad_alloc&)
4483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004484 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004485 }
4486}
4487
4488void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4489 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004491 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004492 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004493 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494
4495 try
4496 {
4497 if (width < 0 || height < 0)
4498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500 }
4501
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503
4504 if (context)
4505 {
Jamie Madill26e91952014-03-05 15:01:27 -05004506 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4507 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004508 {
Jamie Madill26e91952014-03-05 15:01:27 -05004509 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004510 }
4511
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004512 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513 }
4514 }
4515 catch(std::bad_alloc&)
4516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004517 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518 }
4519}
4520
4521void __stdcall glReleaseShaderCompiler(void)
4522{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004523 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004524
4525 try
4526 {
4527 gl::Shader::releaseCompiler();
4528 }
4529 catch(std::bad_alloc&)
4530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004531 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004532 }
4533}
4534
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004535void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004537 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 +00004538 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004539
4540 try
4541 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543
4544 if (context)
4545 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004546 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004547 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004548 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004549 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004551
4552 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 }
4554 }
4555 catch(std::bad_alloc&)
4556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004557 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558 }
4559}
4560
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004561void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4562{
4563 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4564}
4565
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4567{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004568 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569
4570 try
4571 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004572 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004573
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 if (context)
4575 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004576 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004577 }
4578 }
4579 catch(std::bad_alloc&)
4580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004581 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582 }
4583}
4584
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004585void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004587 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004588
4589 try
4590 {
4591 if (condition != GL_ALL_COMPLETED_NV)
4592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004593 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004594 }
4595
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004596 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004597
4598 if (context)
4599 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004600 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004601
4602 if (fenceObject == NULL)
4603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004605 }
4606
4607 fenceObject->setFence(condition);
4608 }
4609 }
4610 catch(std::bad_alloc&)
4611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004612 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004613 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004614}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004615
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004616void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004618 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 +00004619
4620 try
4621 {
4622 if (width < 0 || height < 0)
4623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004624 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 }
4626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004627 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004628
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629 if (context)
4630 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004631 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633 }
4634 catch(std::bad_alloc&)
4635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004636 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 }
4638}
4639
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004640void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004642 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004643 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004644 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645
4646 try
4647 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004648 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004650 }
4651 catch(std::bad_alloc&)
4652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655}
4656
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004657void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004659 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 +00004660 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661
4662 try
4663 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004664 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004667 }
4668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670
4671 if (context)
4672 {
4673 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004674
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675 if (!shaderObject)
4676 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004677 if (context->getProgram(shader))
4678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004679 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004680 }
4681 else
4682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004683 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004684 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004685 }
4686
4687 shaderObject->setSource(count, string, length);
4688 }
4689 }
4690 catch(std::bad_alloc&)
4691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004692 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693 }
4694}
4695
4696void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4697{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004698 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699}
4700
4701void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004703 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 +00004704
4705 try
4706 {
4707 switch (face)
4708 {
4709 case GL_FRONT:
4710 case GL_BACK:
4711 case GL_FRONT_AND_BACK:
4712 break;
4713 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004714 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004715 }
4716
4717 switch (func)
4718 {
4719 case GL_NEVER:
4720 case GL_ALWAYS:
4721 case GL_LESS:
4722 case GL_LEQUAL:
4723 case GL_EQUAL:
4724 case GL_GEQUAL:
4725 case GL_GREATER:
4726 case GL_NOTEQUAL:
4727 break;
4728 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004729 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730 }
4731
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733
4734 if (context)
4735 {
4736 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4737 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004738 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 }
4740
4741 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4742 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004743 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745 }
4746 }
4747 catch(std::bad_alloc&)
4748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004749 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750 }
4751}
4752
4753void __stdcall glStencilMask(GLuint mask)
4754{
4755 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4756}
4757
4758void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4759{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004760 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761
4762 try
4763 {
4764 switch (face)
4765 {
4766 case GL_FRONT:
4767 case GL_BACK:
4768 case GL_FRONT_AND_BACK:
4769 break;
4770 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004771 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 }
4773
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775
4776 if (context)
4777 {
4778 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4779 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004780 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782
4783 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4784 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004785 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787 }
4788 }
4789 catch(std::bad_alloc&)
4790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792 }
4793}
4794
4795void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4796{
4797 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4798}
4799
4800void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004802 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 +00004803 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804
4805 try
4806 {
4807 switch (face)
4808 {
4809 case GL_FRONT:
4810 case GL_BACK:
4811 case GL_FRONT_AND_BACK:
4812 break;
4813 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004814 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815 }
4816
4817 switch (fail)
4818 {
4819 case GL_ZERO:
4820 case GL_KEEP:
4821 case GL_REPLACE:
4822 case GL_INCR:
4823 case GL_DECR:
4824 case GL_INVERT:
4825 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004826 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 break;
4828 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004829 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
4831
4832 switch (zfail)
4833 {
4834 case GL_ZERO:
4835 case GL_KEEP:
4836 case GL_REPLACE:
4837 case GL_INCR:
4838 case GL_DECR:
4839 case GL_INVERT:
4840 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004841 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 break;
4843 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004844 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845 }
4846
4847 switch (zpass)
4848 {
4849 case GL_ZERO:
4850 case GL_KEEP:
4851 case GL_REPLACE:
4852 case GL_INCR:
4853 case GL_DECR:
4854 case GL_INVERT:
4855 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004856 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857 break;
4858 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004859 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 }
4861
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004862 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863
4864 if (context)
4865 {
4866 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4867 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004868 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870
4871 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4872 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004873 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004874 }
4875 }
4876 }
4877 catch(std::bad_alloc&)
4878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004879 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004880 }
4881}
4882
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004883GLboolean __stdcall glTestFenceNV(GLuint fence)
4884{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004885 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004886
4887 try
4888 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004889 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004890
4891 if (context)
4892 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004893 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004894
4895 if (fenceObject == NULL)
4896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004897 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004898 }
4899
Jamie Madillfb9a7402013-07-26 11:55:01 -04004900 if (fenceObject->isFence() != GL_TRUE)
4901 {
4902 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4903 }
4904
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004905 return fenceObject->testFence();
4906 }
4907 }
4908 catch(std::bad_alloc&)
4909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004910 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004911 }
4912
4913 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004914}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004915
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004916void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4917 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004919 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004920 "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 +00004921 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922
4923 try
4924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004926
4927 if (context)
4928 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004929 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004930 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004931 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004932 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004933 return;
4934 }
4935
4936 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004937 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004938 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004939 {
4940 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004941 }
4942
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004943 switch (target)
4944 {
4945 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004946 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004947 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004948 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004949 }
4950 break;
4951 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004952 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004953 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004954 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004956 break;
4957 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4958 {
4959 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004960 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004961 }
4962 break;
4963 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4964 {
4965 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004966 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004967 }
4968 break;
4969 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4970 {
4971 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004972 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004973 }
4974 break;
4975 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4976 {
4977 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004978 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004979 }
4980 break;
4981 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4982 {
4983 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004984 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004985 }
4986 break;
4987 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988 }
4989 }
4990 }
4991 catch(std::bad_alloc&)
4992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004993 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994 }
4995}
4996
4997void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4998{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004999 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5000
5001 try
5002 {
5003 gl::Context *context = gl::getNonLostContext();
5004
5005 if (context)
5006 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005007 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005008 {
5009 return;
5010 }
5011
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005012 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005013
Jamie Madillfb8a8302013-07-03 14:24:12 -04005014 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005016 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005017 }
5018
5019 switch (pname)
5020 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005021 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5022 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5023 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5024 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5025 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5026 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005027 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005028 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5029 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005030 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5031 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5032 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5033 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005034 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
5035 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
5036 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
5037 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005038 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005039 }
5040 }
5041 }
5042 catch(std::bad_alloc&)
5043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005044 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005045 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046}
5047
5048void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5049{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005050 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005051}
5052
5053void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5054{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005055 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005056
5057 try
5058 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005059 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005060
5061 if (context)
5062 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005063 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005064 {
5065 return;
5066 }
5067
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005068 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005069
Jamie Madillfb8a8302013-07-03 14:24:12 -04005070 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005072 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005073 }
5074
5075 switch (pname)
5076 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005077 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5078 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5079 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5080 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5081 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5082 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5083 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5084 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5085 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005086 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5087 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5088 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5089 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005090 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5091 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5092 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5093 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005094 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005095 }
5096 }
5097 }
5098 catch(std::bad_alloc&)
5099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005100 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005101 }
5102}
5103
5104void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5105{
5106 glTexParameteri(target, pname, *params);
5107}
5108
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005109void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5110{
5111 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5112 target, levels, internalformat, width, height);
5113
5114 try
5115 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005116 gl::Context *context = gl::getNonLostContext();
5117
5118 if (context)
5119 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005120 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005121 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005122 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005123 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005124 }
5125
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005126 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005127 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005128 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005129 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005130 }
5131
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005132 switch (target)
5133 {
5134 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005135 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005136 gl::Texture2D *texture2d = context->getTexture2D();
5137 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005138 }
5139 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005140
Geoff Lang01c21d22013-09-24 11:52:16 -04005141 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005142 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005143 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5144 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005145 }
5146 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005147
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005148 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005149 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005150 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005151 }
5152 }
5153 catch(std::bad_alloc&)
5154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005155 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005156 }
5157}
5158
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005159void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5160 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005162 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005163 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005164 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 target, level, xoffset, yoffset, width, height, format, type, pixels);
5166
5167 try
5168 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005169 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005170
5171 if (context)
5172 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005173 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005174 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005175 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005176 {
5177 return;
5178 }
5179
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005180 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005181 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005182 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005183 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005184 return;
5185 }
5186
Geoff Langc41e42d2014-04-28 10:58:16 -04005187 // Zero sized uploads are valid but no-ops
5188 if (width == 0 || height == 0)
5189 {
5190 return;
5191 }
5192
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005193 switch (target)
5194 {
5195 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005196 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005197 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005198 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005199 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005200 break;
5201
5202 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5203 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5204 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5205 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5206 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5207 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005208 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005209 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005210 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005211 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005212 break;
5213
5214 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005215 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005216 }
5217 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218 }
5219 catch(std::bad_alloc&)
5220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005221 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222 }
5223}
5224
5225void __stdcall glUniform1f(GLint location, GLfloat x)
5226{
5227 glUniform1fv(location, 1, &x);
5228}
5229
5230void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005232 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005233
5234 try
5235 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005236 if (count < 0)
5237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239 }
5240
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005241 if (location == -1)
5242 {
5243 return;
5244 }
5245
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005246 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005247
5248 if (context)
5249 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005250 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005251 if (!programBinary)
5252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005253 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005254 }
5255
5256 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005258 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
5260 }
5261 }
5262 catch(std::bad_alloc&)
5263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 }
5266}
5267
5268void __stdcall glUniform1i(GLint location, GLint x)
5269{
5270 glUniform1iv(location, 1, &x);
5271}
5272
5273void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005275 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 try
5278 {
5279 if (count < 0)
5280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282 }
5283
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005284 if (location == -1)
5285 {
5286 return;
5287 }
5288
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290
5291 if (context)
5292 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005293 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005294 if (!programBinary)
5295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005296 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005297 }
5298
5299 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005301 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005302 }
5303 }
5304 }
5305 catch(std::bad_alloc&)
5306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308 }
5309}
5310
5311void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5312{
5313 GLfloat xy[2] = {x, y};
5314
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005315 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316}
5317
5318void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005320 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321
5322 try
5323 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324 if (count < 0)
5325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005327 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005328
5329 if (location == -1)
5330 {
5331 return;
5332 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335
5336 if (context)
5337 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005338 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005339 if (!programBinary)
5340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005341 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005342 }
5343
5344 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347 }
5348 }
5349 }
5350 catch(std::bad_alloc&)
5351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353 }
5354}
5355
5356void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5357{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005358 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005359
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005360 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005361}
5362
5363void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5364{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005365 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366
5367 try
5368 {
5369 if (count < 0)
5370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005371 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372 }
5373
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005374 if (location == -1)
5375 {
5376 return;
5377 }
5378
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005380
5381 if (context)
5382 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005383 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005384 if (!programBinary)
5385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005386 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005387 }
5388
5389 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005391 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005392 }
5393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394 }
5395 catch(std::bad_alloc&)
5396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398 }
5399}
5400
5401void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5402{
5403 GLfloat xyz[3] = {x, y, z};
5404
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005405 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406}
5407
5408void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005410 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005411
5412 try
5413 {
5414 if (count < 0)
5415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417 }
5418
5419 if (location == -1)
5420 {
5421 return;
5422 }
5423
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425
5426 if (context)
5427 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005428 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005429 if (!programBinary)
5430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005432 }
5433
5434 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005436 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005437 }
5438 }
5439 }
5440 catch(std::bad_alloc&)
5441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005442 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443 }
5444}
5445
5446void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5447{
5448 GLint xyz[3] = {x, y, z};
5449
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005450 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451}
5452
5453void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005455 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456
5457 try
5458 {
5459 if (count < 0)
5460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005461 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 }
5463
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005464 if (location == -1)
5465 {
5466 return;
5467 }
5468
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005470
5471 if (context)
5472 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005473 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005474 if (!programBinary)
5475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005477 }
5478
5479 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005482 }
5483 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 }
5485 catch(std::bad_alloc&)
5486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005487 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005488 }
5489}
5490
5491void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5492{
5493 GLfloat xyzw[4] = {x, y, z, w};
5494
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005495 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496}
5497
5498void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5499{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005500 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005501
5502 try
5503 {
5504 if (count < 0)
5505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005506 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005507 }
5508
5509 if (location == -1)
5510 {
5511 return;
5512 }
5513
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005514 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515
5516 if (context)
5517 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005518 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005519 if (!programBinary)
5520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005522 }
5523
5524 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527 }
5528 }
5529 }
5530 catch(std::bad_alloc&)
5531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005532 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533 }
5534}
5535
5536void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5537{
5538 GLint xyzw[4] = {x, y, z, w};
5539
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005540 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541}
5542
5543void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005545 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546
5547 try
5548 {
5549 if (count < 0)
5550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552 }
5553
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005554 if (location == -1)
5555 {
5556 return;
5557 }
5558
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005560
5561 if (context)
5562 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005563 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005564 if (!programBinary)
5565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005567 }
5568
5569 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005571 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005572 }
5573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574 }
5575 catch(std::bad_alloc&)
5576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005577 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578 }
5579}
5580
5581void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5582{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005583 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005584 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585
5586 try
5587 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005588 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005590 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005591 }
5592
5593 if (location == -1)
5594 {
5595 return;
5596 }
5597
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005598 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599
5600 if (context)
5601 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005602 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5603 {
5604 return gl::error(GL_INVALID_VALUE);
5605 }
5606
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005607 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005608 if (!programBinary)
5609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005611 }
5612
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005613 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005615 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616 }
5617 }
5618 }
5619 catch(std::bad_alloc&)
5620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005622 }
5623}
5624
5625void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5626{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005627 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005628 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629
5630 try
5631 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005632 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005634 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005635 }
5636
5637 if (location == -1)
5638 {
5639 return;
5640 }
5641
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005642 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643
5644 if (context)
5645 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005646 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5647 {
5648 return gl::error(GL_INVALID_VALUE);
5649 }
5650
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005651 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005652 if (!programBinary)
5653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005655 }
5656
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005657 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005659 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005660 }
5661 }
5662 }
5663 catch(std::bad_alloc&)
5664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005665 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005666 }
5667}
5668
5669void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5670{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005671 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005672 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005673
5674 try
5675 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005676 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005678 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 }
5680
5681 if (location == -1)
5682 {
5683 return;
5684 }
5685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005687
5688 if (context)
5689 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005690 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5691 {
5692 return gl::error(GL_INVALID_VALUE);
5693 }
5694
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005695 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005696 if (!programBinary)
5697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005698 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005699 }
5700
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005701 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005703 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005704 }
5705 }
5706 }
5707 catch(std::bad_alloc&)
5708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005709 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005710 }
5711}
5712
5713void __stdcall glUseProgram(GLuint program)
5714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005715 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716
5717 try
5718 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005719 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720
5721 if (context)
5722 {
5723 gl::Program *programObject = context->getProgram(program);
5724
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005725 if (!programObject && program != 0)
5726 {
5727 if (context->getShader(program))
5728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005730 }
5731 else
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005734 }
5735 }
5736
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005737 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740 }
5741
5742 context->useProgram(program);
5743 }
5744 }
5745 catch(std::bad_alloc&)
5746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748 }
5749}
5750
5751void __stdcall glValidateProgram(GLuint program)
5752{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005753 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005754
5755 try
5756 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005757 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005758
5759 if (context)
5760 {
5761 gl::Program *programObject = context->getProgram(program);
5762
5763 if (!programObject)
5764 {
5765 if (context->getShader(program))
5766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005767 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005768 }
5769 else
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005772 }
5773 }
5774
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005775 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005776 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005777 }
5778 catch(std::bad_alloc&)
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005781 }
5782}
5783
5784void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5785{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005786 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787
5788 try
5789 {
5790 if (index >= gl::MAX_VERTEX_ATTRIBS)
5791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005796
5797 if (context)
5798 {
5799 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005800 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005801 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802 }
5803 catch(std::bad_alloc&)
5804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005805 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806 }
5807}
5808
5809void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5810{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005811 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812
5813 try
5814 {
5815 if (index >= gl::MAX_VERTEX_ATTRIBS)
5816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005821
5822 if (context)
5823 {
5824 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005825 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005826 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005827 }
5828 catch(std::bad_alloc&)
5829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005830 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831 }
5832}
5833
5834void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5835{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005836 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005837
5838 try
5839 {
5840 if (index >= gl::MAX_VERTEX_ATTRIBS)
5841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005842 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 }
5844
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005845 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005846
5847 if (context)
5848 {
5849 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005850 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005851 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005852 }
5853 catch(std::bad_alloc&)
5854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005855 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 }
5857}
5858
5859void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005861 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862
5863 try
5864 {
5865 if (index >= gl::MAX_VERTEX_ATTRIBS)
5866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005867 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 }
5869
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005870 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005871
5872 if (context)
5873 {
5874 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005875 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005876 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005877 }
5878 catch(std::bad_alloc&)
5879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 }
5882}
5883
5884void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005886 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 +00005887
5888 try
5889 {
5890 if (index >= gl::MAX_VERTEX_ATTRIBS)
5891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005892 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005893 }
5894
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005896
5897 if (context)
5898 {
5899 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005900 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005901 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005902 }
5903 catch(std::bad_alloc&)
5904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907}
5908
5909void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005911 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912
5913 try
5914 {
5915 if (index >= gl::MAX_VERTEX_ATTRIBS)
5916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005918 }
5919
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005921
5922 if (context)
5923 {
5924 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005925 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005926 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005927 }
5928 catch(std::bad_alloc&)
5929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931 }
5932}
5933
5934void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5935{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005936 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 +00005937
5938 try
5939 {
5940 if (index >= gl::MAX_VERTEX_ATTRIBS)
5941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005942 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005943 }
5944
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005945 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005946
5947 if (context)
5948 {
5949 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005950 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005951 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005952 }
5953 catch(std::bad_alloc&)
5954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005955 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956 }
5957}
5958
5959void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5960{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005961 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005962
5963 try
5964 {
5965 if (index >= gl::MAX_VERTEX_ATTRIBS)
5966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005967 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 }
5969
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005971
5972 if (context)
5973 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005974 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005975 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005976 }
5977 catch(std::bad_alloc&)
5978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005980 }
5981}
5982
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005983void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5984{
5985 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5986
5987 try
5988 {
5989 if (index >= gl::MAX_VERTEX_ATTRIBS)
5990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005992 }
5993
5994 gl::Context *context = gl::getNonLostContext();
5995
5996 if (context)
5997 {
5998 context->setVertexAttribDivisor(index, divisor);
5999 }
6000 }
6001 catch(std::bad_alloc&)
6002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006004 }
6005}
6006
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006007void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006009 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006010 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006011 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006012
6013 try
6014 {
6015 if (index >= gl::MAX_VERTEX_ATTRIBS)
6016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019
6020 if (size < 1 || size > 4)
6021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006022 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006023 }
6024
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006025 gl::Context *context = gl::getNonLostContext();
6026
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006027 switch (type)
6028 {
6029 case GL_BYTE:
6030 case GL_UNSIGNED_BYTE:
6031 case GL_SHORT:
6032 case GL_UNSIGNED_SHORT:
6033 case GL_FIXED:
6034 case GL_FLOAT:
6035 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006036 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006037 case GL_INT:
6038 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006039 case GL_INT_2_10_10_10_REV:
6040 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006041 if (context && context->getClientVersion() < 3)
6042 {
6043 return gl::error(GL_INVALID_ENUM);
6044 }
6045 else
6046 {
6047 break;
6048 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006049 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 }
6052
6053 if (stride < 0)
6054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006055 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006056 }
6057
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006058 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6059 {
6060 return gl::error(GL_INVALID_OPERATION);
6061 }
6062
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006063 if (context)
6064 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006065 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6066 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6067 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6068 // and the pointer argument is not NULL.
6069 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6070 {
6071 return gl::error(GL_INVALID_OPERATION);
6072 }
6073
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006074 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6075 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006076 }
6077 }
6078 catch(std::bad_alloc&)
6079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006081 }
6082}
6083
6084void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006086 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 +00006087
6088 try
6089 {
6090 if (width < 0 || height < 0)
6091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006092 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093 }
6094
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006095 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006096
6097 if (context)
6098 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006099 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100 }
6101 }
6102 catch(std::bad_alloc&)
6103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 }
6106}
6107
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006108// OpenGL ES 3.0 functions
6109
6110void __stdcall glReadBuffer(GLenum mode)
6111{
6112 EVENT("(GLenum mode = 0x%X)", mode);
6113
6114 try
6115 {
6116 gl::Context *context = gl::getNonLostContext();
6117
6118 if (context)
6119 {
6120 if (context->getClientVersion() < 3)
6121 {
6122 return gl::error(GL_INVALID_OPERATION);
6123 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006124
Jamie Madill54133512013-06-21 09:33:07 -04006125 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006126 UNIMPLEMENTED();
6127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006128 }
6129 catch(std::bad_alloc&)
6130 {
6131 return gl::error(GL_OUT_OF_MEMORY);
6132 }
6133}
6134
6135void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6136{
6137 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6138 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6139
6140 try
6141 {
6142 gl::Context *context = gl::getNonLostContext();
6143
6144 if (context)
6145 {
6146 if (context->getClientVersion() < 3)
6147 {
6148 return gl::error(GL_INVALID_OPERATION);
6149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006150
Jamie Madill54133512013-06-21 09:33:07 -04006151 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006152 UNIMPLEMENTED();
6153 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006154 }
6155 catch(std::bad_alloc&)
6156 {
6157 return gl::error(GL_OUT_OF_MEMORY);
6158 }
6159}
6160
6161void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6162{
6163 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6164 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6165 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6166 target, level, internalformat, width, height, depth, border, format, type, pixels);
6167
6168 try
6169 {
6170 gl::Context *context = gl::getNonLostContext();
6171
6172 if (context)
6173 {
6174 if (context->getClientVersion() < 3)
6175 {
6176 return gl::error(GL_INVALID_OPERATION);
6177 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006178
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006179 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006180 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006181 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006182 {
6183 return;
6184 }
6185
6186 switch(target)
6187 {
6188 case GL_TEXTURE_3D:
6189 {
6190 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006191 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006192 }
6193 break;
6194
6195 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006196 {
6197 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006198 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006199 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006200 break;
6201
6202 default:
6203 return gl::error(GL_INVALID_ENUM);
6204 }
6205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006206 }
6207 catch(std::bad_alloc&)
6208 {
6209 return gl::error(GL_OUT_OF_MEMORY);
6210 }
6211}
6212
6213void __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)
6214{
6215 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6216 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6217 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6218 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6219
6220 try
6221 {
6222 gl::Context *context = gl::getNonLostContext();
6223
6224 if (context)
6225 {
6226 if (context->getClientVersion() < 3)
6227 {
6228 return gl::error(GL_INVALID_OPERATION);
6229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006230
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006231 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006232 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006233 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006234 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006235 {
6236 return;
6237 }
6238
Geoff Langc41e42d2014-04-28 10:58:16 -04006239 // Zero sized uploads are valid but no-ops
6240 if (width == 0 || height == 0 || depth == 0)
6241 {
6242 return;
6243 }
6244
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006245 switch(target)
6246 {
6247 case GL_TEXTURE_3D:
6248 {
6249 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006250 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 +00006251 }
6252 break;
6253
6254 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006255 {
6256 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006257 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 +00006258 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006259 break;
6260
6261 default:
6262 return gl::error(GL_INVALID_ENUM);
6263 }
6264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006265 }
6266 catch(std::bad_alloc&)
6267 {
6268 return gl::error(GL_OUT_OF_MEMORY);
6269 }
6270}
6271
6272void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6273{
6274 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6275 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6276 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6277
6278 try
6279 {
6280 gl::Context *context = gl::getNonLostContext();
6281
6282 if (context)
6283 {
6284 if (context->getClientVersion() < 3)
6285 {
6286 return gl::error(GL_INVALID_OPERATION);
6287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006288
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006289 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006290 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006291 {
6292 return;
6293 }
6294
Geoff Langc41e42d2014-04-28 10:58:16 -04006295 // Zero sized copies are valid but no-ops
6296 if (width == 0 || height == 0)
6297 {
6298 return;
6299 }
6300
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006301 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6302 gl::Texture *texture = NULL;
6303 switch (target)
6304 {
6305 case GL_TEXTURE_3D:
6306 texture = context->getTexture3D();
6307 break;
6308
6309 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006310 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006311 break;
6312
6313 default:
6314 return gl::error(GL_INVALID_ENUM);
6315 }
6316
6317 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006319 }
6320 catch(std::bad_alloc&)
6321 {
6322 return gl::error(GL_OUT_OF_MEMORY);
6323 }
6324}
6325
6326void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6327{
Geoff Langeef52cc2013-10-16 15:07:39 -04006328 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 +00006329 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6330 "const GLvoid* data = 0x%0.8p)",
6331 target, level, internalformat, width, height, depth, border, imageSize, data);
6332
6333 try
6334 {
6335 gl::Context *context = gl::getNonLostContext();
6336
6337 if (context)
6338 {
6339 if (context->getClientVersion() < 3)
6340 {
6341 return gl::error(GL_INVALID_OPERATION);
6342 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006343
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006344 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 +00006345 {
6346 return gl::error(GL_INVALID_VALUE);
6347 }
6348
6349 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006350 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006351 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006352 {
6353 return;
6354 }
6355
6356 switch(target)
6357 {
6358 case GL_TEXTURE_3D:
6359 {
6360 gl::Texture3D *texture = context->getTexture3D();
6361 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6362 }
6363 break;
6364
6365 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006366 {
6367 gl::Texture2DArray *texture = context->getTexture2DArray();
6368 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6369 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006370 break;
6371
6372 default:
6373 return gl::error(GL_INVALID_ENUM);
6374 }
6375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006376 }
6377 catch(std::bad_alloc&)
6378 {
6379 return gl::error(GL_OUT_OF_MEMORY);
6380 }
6381}
6382
6383void __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)
6384{
6385 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6386 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6387 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6388 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6389
6390 try
6391 {
6392 gl::Context *context = gl::getNonLostContext();
6393
6394 if (context)
6395 {
6396 if (context->getClientVersion() < 3)
6397 {
6398 return gl::error(GL_INVALID_OPERATION);
6399 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006400
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006401 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 +00006402 {
6403 return gl::error(GL_INVALID_VALUE);
6404 }
6405
6406 if (!data)
6407 {
6408 return gl::error(GL_INVALID_VALUE);
6409 }
6410
6411 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006412 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006413 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006414 {
6415 return;
6416 }
6417
Geoff Langc41e42d2014-04-28 10:58:16 -04006418 // Zero sized uploads are valid but no-ops
6419 if (width == 0 || height == 0)
6420 {
6421 return;
6422 }
6423
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006424 switch(target)
6425 {
6426 case GL_TEXTURE_3D:
6427 {
6428 gl::Texture3D *texture = context->getTexture3D();
6429 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6430 format, imageSize, data);
6431 }
6432 break;
6433
6434 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006435 {
6436 gl::Texture2DArray *texture = context->getTexture2DArray();
6437 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6438 format, imageSize, data);
6439 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006440 break;
6441
6442 default:
6443 return gl::error(GL_INVALID_ENUM);
6444 }
6445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006446 }
6447 catch(std::bad_alloc&)
6448 {
6449 return gl::error(GL_OUT_OF_MEMORY);
6450 }
6451}
6452
6453void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6454{
6455 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6456
6457 try
6458 {
6459 gl::Context *context = gl::getNonLostContext();
6460
6461 if (context)
6462 {
6463 if (context->getClientVersion() < 3)
6464 {
6465 return gl::error(GL_INVALID_OPERATION);
6466 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006467
Geoff Lang37dde692014-01-31 16:34:54 -05006468 if (n < 0)
6469 {
6470 return gl::error(GL_INVALID_VALUE);
6471 }
6472
6473 for (GLsizei i = 0; i < n; i++)
6474 {
6475 ids[i] = context->createQuery();
6476 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006478 }
6479 catch(std::bad_alloc&)
6480 {
6481 return gl::error(GL_OUT_OF_MEMORY);
6482 }
6483}
6484
6485void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6486{
6487 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6488
6489 try
6490 {
6491 gl::Context *context = gl::getNonLostContext();
6492
6493 if (context)
6494 {
6495 if (context->getClientVersion() < 3)
6496 {
6497 return gl::error(GL_INVALID_OPERATION);
6498 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006499
Geoff Lang37dde692014-01-31 16:34:54 -05006500 if (n < 0)
6501 {
6502 return gl::error(GL_INVALID_VALUE);
6503 }
6504
6505 for (GLsizei i = 0; i < n; i++)
6506 {
6507 context->deleteQuery(ids[i]);
6508 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006510 }
6511 catch(std::bad_alloc&)
6512 {
6513 return gl::error(GL_OUT_OF_MEMORY);
6514 }
6515}
6516
6517GLboolean __stdcall glIsQuery(GLuint id)
6518{
6519 EVENT("(GLuint id = %u)", id);
6520
6521 try
6522 {
6523 gl::Context *context = gl::getNonLostContext();
6524
6525 if (context)
6526 {
6527 if (context->getClientVersion() < 3)
6528 {
6529 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006531
Geoff Lang37dde692014-01-31 16:34:54 -05006532 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006534 }
6535 catch(std::bad_alloc&)
6536 {
6537 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6538 }
6539
6540 return GL_FALSE;
6541}
6542
6543void __stdcall glBeginQuery(GLenum target, GLuint id)
6544{
6545 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6546
6547 try
6548 {
6549 gl::Context *context = gl::getNonLostContext();
6550
6551 if (context)
6552 {
6553 if (context->getClientVersion() < 3)
6554 {
6555 return gl::error(GL_INVALID_OPERATION);
6556 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006557
Geoff Lang37dde692014-01-31 16:34:54 -05006558 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006559 {
Geoff Lang37dde692014-01-31 16:34:54 -05006560 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006561 }
6562
6563 if (id == 0)
6564 {
6565 return gl::error(GL_INVALID_OPERATION);
6566 }
6567
Geoff Lang37dde692014-01-31 16:34:54 -05006568 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006569 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006570 }
6571 catch(std::bad_alloc&)
6572 {
6573 return gl::error(GL_OUT_OF_MEMORY);
6574 }
6575}
6576
6577void __stdcall glEndQuery(GLenum target)
6578{
6579 EVENT("(GLenum target = 0x%X)", target);
6580
6581 try
6582 {
6583 gl::Context *context = gl::getNonLostContext();
6584
6585 if (context)
6586 {
6587 if (context->getClientVersion() < 3)
6588 {
6589 return gl::error(GL_INVALID_OPERATION);
6590 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006591
Geoff Lang37dde692014-01-31 16:34:54 -05006592 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006593 {
Geoff Lang37dde692014-01-31 16:34:54 -05006594 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006595 }
Geoff Lang37dde692014-01-31 16:34:54 -05006596
6597 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006598 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006599 }
6600 catch(std::bad_alloc&)
6601 {
6602 return gl::error(GL_OUT_OF_MEMORY);
6603 }
6604}
6605
6606void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6607{
6608 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6609
6610 try
6611 {
6612 gl::Context *context = gl::getNonLostContext();
6613
6614 if (context)
6615 {
6616 if (context->getClientVersion() < 3)
6617 {
6618 return gl::error(GL_INVALID_OPERATION);
6619 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006620
Geoff Lang37dde692014-01-31 16:34:54 -05006621 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006622 {
Geoff Lang37dde692014-01-31 16:34:54 -05006623 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006624 }
Geoff Lang37dde692014-01-31 16:34:54 -05006625
6626 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006627 {
Geoff Lang37dde692014-01-31 16:34:54 -05006628 case GL_CURRENT_QUERY:
6629 params[0] = context->getActiveQuery(target);
6630 break;
6631
6632 default:
6633 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006634 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006636 }
6637 catch(std::bad_alloc&)
6638 {
6639 return gl::error(GL_OUT_OF_MEMORY);
6640 }
6641}
6642
6643void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6644{
6645 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6646
6647 try
6648 {
6649 gl::Context *context = gl::getNonLostContext();
6650
6651 if (context)
6652 {
6653 if (context->getClientVersion() < 3)
6654 {
6655 return gl::error(GL_INVALID_OPERATION);
6656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006657
Geoff Lang37dde692014-01-31 16:34:54 -05006658 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6659
6660 if (!queryObject)
6661 {
6662 return gl::error(GL_INVALID_OPERATION);
6663 }
6664
6665 if (context->getActiveQuery(queryObject->getType()) == id)
6666 {
6667 return gl::error(GL_INVALID_OPERATION);
6668 }
6669
6670 switch(pname)
6671 {
6672 case GL_QUERY_RESULT:
6673 params[0] = queryObject->getResult();
6674 break;
6675 case GL_QUERY_RESULT_AVAILABLE:
6676 params[0] = queryObject->isResultAvailable();
6677 break;
6678 default:
6679 return gl::error(GL_INVALID_ENUM);
6680 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006681 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006682 }
6683 catch(std::bad_alloc&)
6684 {
6685 return gl::error(GL_OUT_OF_MEMORY);
6686 }
6687}
6688
6689GLboolean __stdcall glUnmapBuffer(GLenum target)
6690{
6691 EVENT("(GLenum target = 0x%X)", target);
6692
6693 try
6694 {
6695 gl::Context *context = gl::getNonLostContext();
6696
6697 if (context)
6698 {
6699 if (context->getClientVersion() < 3)
6700 {
6701 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006703
Shannon Woodsb3801742014-03-27 14:59:19 -04006704 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006706 }
6707 catch(std::bad_alloc&)
6708 {
6709 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6710 }
6711
6712 return GL_FALSE;
6713}
6714
6715void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6716{
6717 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6718
6719 try
6720 {
6721 gl::Context *context = gl::getNonLostContext();
6722
6723 if (context)
6724 {
6725 if (context->getClientVersion() < 3)
6726 {
6727 return gl::error(GL_INVALID_OPERATION);
6728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006729
Shannon Woodsb3801742014-03-27 14:59:19 -04006730 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006732 }
6733 catch(std::bad_alloc&)
6734 {
6735 return gl::error(GL_OUT_OF_MEMORY);
6736 }
6737}
6738
6739void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6740{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006741 try
6742 {
6743 gl::Context *context = gl::getNonLostContext();
6744
6745 if (context)
6746 {
6747 if (context->getClientVersion() < 3)
6748 {
6749 return gl::error(GL_INVALID_OPERATION);
6750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006751
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006752 glDrawBuffersEXT(n, bufs);
6753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006754 }
6755 catch(std::bad_alloc&)
6756 {
6757 return gl::error(GL_OUT_OF_MEMORY);
6758 }
6759}
6760
6761void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6762{
6763 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6764 location, count, transpose, value);
6765
6766 try
6767 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006768 if (count < 0)
6769 {
6770 return gl::error(GL_INVALID_VALUE);
6771 }
6772
6773 if (location == -1)
6774 {
6775 return;
6776 }
6777
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006778 gl::Context *context = gl::getNonLostContext();
6779
6780 if (context)
6781 {
6782 if (context->getClientVersion() < 3)
6783 {
6784 return gl::error(GL_INVALID_OPERATION);
6785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006786
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006787 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6788 if (!programBinary)
6789 {
6790 return gl::error(GL_INVALID_OPERATION);
6791 }
6792
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006793 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006794 {
6795 return gl::error(GL_INVALID_OPERATION);
6796 }
6797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006798 }
6799 catch(std::bad_alloc&)
6800 {
6801 return gl::error(GL_OUT_OF_MEMORY);
6802 }
6803}
6804
6805void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6806{
6807 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6808 location, count, transpose, value);
6809
6810 try
6811 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006812 if (count < 0)
6813 {
6814 return gl::error(GL_INVALID_VALUE);
6815 }
6816
6817 if (location == -1)
6818 {
6819 return;
6820 }
6821
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006822 gl::Context *context = gl::getNonLostContext();
6823
6824 if (context)
6825 {
6826 if (context->getClientVersion() < 3)
6827 {
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006830
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006831 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6832 if (!programBinary)
6833 {
6834 return gl::error(GL_INVALID_OPERATION);
6835 }
6836
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006837 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006838 {
6839 return gl::error(GL_INVALID_OPERATION);
6840 }
6841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006842 }
6843 catch(std::bad_alloc&)
6844 {
6845 return gl::error(GL_OUT_OF_MEMORY);
6846 }
6847}
6848
6849void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6850{
6851 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6852 location, count, transpose, value);
6853
6854 try
6855 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006856 if (count < 0)
6857 {
6858 return gl::error(GL_INVALID_VALUE);
6859 }
6860
6861 if (location == -1)
6862 {
6863 return;
6864 }
6865
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006866 gl::Context *context = gl::getNonLostContext();
6867
6868 if (context)
6869 {
6870 if (context->getClientVersion() < 3)
6871 {
6872 return gl::error(GL_INVALID_OPERATION);
6873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006874
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006875 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6876 if (!programBinary)
6877 {
6878 return gl::error(GL_INVALID_OPERATION);
6879 }
6880
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006881 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006882 {
6883 return gl::error(GL_INVALID_OPERATION);
6884 }
6885 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006886 }
6887 catch(std::bad_alloc&)
6888 {
6889 return gl::error(GL_OUT_OF_MEMORY);
6890 }
6891}
6892
6893void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6894{
6895 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6896 location, count, transpose, value);
6897
6898 try
6899 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006900 if (count < 0)
6901 {
6902 return gl::error(GL_INVALID_VALUE);
6903 }
6904
6905 if (location == -1)
6906 {
6907 return;
6908 }
6909
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006910 gl::Context *context = gl::getNonLostContext();
6911
6912 if (context)
6913 {
6914 if (context->getClientVersion() < 3)
6915 {
6916 return gl::error(GL_INVALID_OPERATION);
6917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006918
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006919 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6920 if (!programBinary)
6921 {
6922 return gl::error(GL_INVALID_OPERATION);
6923 }
6924
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006925 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006926 {
6927 return gl::error(GL_INVALID_OPERATION);
6928 }
6929 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006930 }
6931 catch(std::bad_alloc&)
6932 {
6933 return gl::error(GL_OUT_OF_MEMORY);
6934 }
6935}
6936
6937void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6938{
6939 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6940 location, count, transpose, value);
6941
6942 try
6943 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006944 if (count < 0)
6945 {
6946 return gl::error(GL_INVALID_VALUE);
6947 }
6948
6949 if (location == -1)
6950 {
6951 return;
6952 }
6953
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006954 gl::Context *context = gl::getNonLostContext();
6955
6956 if (context)
6957 {
6958 if (context->getClientVersion() < 3)
6959 {
6960 return gl::error(GL_INVALID_OPERATION);
6961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006962
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006963 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6964 if (!programBinary)
6965 {
6966 return gl::error(GL_INVALID_OPERATION);
6967 }
6968
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006969 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006970 {
6971 return gl::error(GL_INVALID_OPERATION);
6972 }
6973 }
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 glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6982{
6983 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6984 location, count, transpose, value);
6985
6986 try
6987 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006988 if (count < 0)
6989 {
6990 return gl::error(GL_INVALID_VALUE);
6991 }
6992
6993 if (location == -1)
6994 {
6995 return;
6996 }
6997
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006998 gl::Context *context = gl::getNonLostContext();
6999
7000 if (context)
7001 {
7002 if (context->getClientVersion() < 3)
7003 {
7004 return gl::error(GL_INVALID_OPERATION);
7005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007006
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007007 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7008 if (!programBinary)
7009 {
7010 return gl::error(GL_INVALID_OPERATION);
7011 }
7012
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007013 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007014 {
7015 return gl::error(GL_INVALID_OPERATION);
7016 }
7017 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007018 }
7019 catch(std::bad_alloc&)
7020 {
7021 return gl::error(GL_OUT_OF_MEMORY);
7022 }
7023}
7024
7025void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7026{
7027 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7028 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7029 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7030
7031 try
7032 {
7033 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007034 if (context)
7035 {
7036 if (context->getClientVersion() < 3)
7037 {
7038 return gl::error(GL_INVALID_OPERATION);
7039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007040
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007041 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007042 dstX0, dstY0, dstX1, dstY1, mask, filter,
7043 false))
7044 {
7045 return;
7046 }
7047
7048 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7049 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007051 }
7052 catch(std::bad_alloc&)
7053 {
7054 return gl::error(GL_OUT_OF_MEMORY);
7055 }
7056}
7057
7058void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7059{
7060 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7061 target, samples, internalformat, width, height);
7062
7063 try
7064 {
7065 gl::Context *context = gl::getNonLostContext();
7066
7067 if (context)
7068 {
7069 if (context->getClientVersion() < 3)
7070 {
7071 return gl::error(GL_INVALID_OPERATION);
7072 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007073
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007074 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007075 width, height, false))
7076 {
7077 return;
7078 }
7079
7080 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007082 }
7083 catch(std::bad_alloc&)
7084 {
7085 return gl::error(GL_OUT_OF_MEMORY);
7086 }
7087}
7088
7089void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7090{
7091 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7092 target, attachment, texture, level, layer);
7093
7094 try
7095 {
7096 gl::Context *context = gl::getNonLostContext();
7097
7098 if (context)
7099 {
7100 if (context->getClientVersion() < 3)
7101 {
7102 return gl::error(GL_INVALID_OPERATION);
7103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007104
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007105 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007106 {
7107 return;
7108 }
7109
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007110 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7111 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007112
7113 gl::Texture *textureObject = context->getTexture(texture);
7114 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7115
7116 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7117 {
7118 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7119 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7120 }
7121 else
7122 {
7123 switch (attachment)
7124 {
7125 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7126 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7127 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7128 }
7129 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007131 }
7132 catch(std::bad_alloc&)
7133 {
7134 return gl::error(GL_OUT_OF_MEMORY);
7135 }
7136}
7137
7138GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7139{
7140 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7141 target, offset, length, access);
7142
7143 try
7144 {
7145 gl::Context *context = gl::getNonLostContext();
7146
7147 if (context)
7148 {
7149 if (context->getClientVersion() < 3)
7150 {
7151 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7152 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007153
Shannon Woods916e7692014-03-27 16:58:22 -04007154 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007155 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007156 }
7157 catch(std::bad_alloc&)
7158 {
7159 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7160 }
7161
7162 return NULL;
7163}
7164
7165void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7166{
7167 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7168
7169 try
7170 {
7171 gl::Context *context = gl::getNonLostContext();
7172
7173 if (context)
7174 {
7175 if (context->getClientVersion() < 3)
7176 {
7177 return gl::error(GL_INVALID_OPERATION);
7178 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007179
Shannon Woods916e7692014-03-27 16:58:22 -04007180 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007182 }
7183 catch(std::bad_alloc&)
7184 {
7185 return gl::error(GL_OUT_OF_MEMORY);
7186 }
7187}
7188
7189void __stdcall glBindVertexArray(GLuint array)
7190{
7191 EVENT("(GLuint array = %u)", array);
7192
7193 try
7194 {
7195 gl::Context *context = gl::getNonLostContext();
7196
7197 if (context)
7198 {
7199 if (context->getClientVersion() < 3)
7200 {
7201 return gl::error(GL_INVALID_OPERATION);
7202 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007203
Jamie Madilld1028542013-07-02 11:57:04 -04007204 gl::VertexArray *vao = context->getVertexArray(array);
7205
7206 if (!vao)
7207 {
7208 // The default VAO should always exist
7209 ASSERT(array != 0);
7210 return gl::error(GL_INVALID_OPERATION);
7211 }
7212
7213 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007214 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007215 }
7216 catch(std::bad_alloc&)
7217 {
7218 return gl::error(GL_OUT_OF_MEMORY);
7219 }
7220}
7221
7222void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7223{
7224 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7225
7226 try
7227 {
7228 gl::Context *context = gl::getNonLostContext();
7229
7230 if (context)
7231 {
7232 if (context->getClientVersion() < 3)
7233 {
7234 return gl::error(GL_INVALID_OPERATION);
7235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007236
Jamie Madilld1028542013-07-02 11:57:04 -04007237 if (n < 0)
7238 {
7239 return gl::error(GL_INVALID_VALUE);
7240 }
7241
7242 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7243 {
7244 if (arrays[arrayIndex] != 0)
7245 {
7246 context->deleteVertexArray(arrays[arrayIndex]);
7247 }
7248 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007250 }
7251 catch(std::bad_alloc&)
7252 {
7253 return gl::error(GL_OUT_OF_MEMORY);
7254 }
7255}
7256
7257void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7258{
7259 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7260
7261 try
7262 {
7263 gl::Context *context = gl::getNonLostContext();
7264
7265 if (context)
7266 {
7267 if (context->getClientVersion() < 3)
7268 {
7269 return gl::error(GL_INVALID_OPERATION);
7270 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007271
Jamie Madilld1028542013-07-02 11:57:04 -04007272 if (n < 0)
7273 {
7274 return gl::error(GL_INVALID_VALUE);
7275 }
7276
7277 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7278 {
7279 arrays[arrayIndex] = context->createVertexArray();
7280 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007282 }
7283 catch(std::bad_alloc&)
7284 {
7285 return gl::error(GL_OUT_OF_MEMORY);
7286 }
7287}
7288
7289GLboolean __stdcall glIsVertexArray(GLuint array)
7290{
7291 EVENT("(GLuint array = %u)", array);
7292
7293 try
7294 {
7295 gl::Context *context = gl::getNonLostContext();
7296
7297 if (context)
7298 {
7299 if (context->getClientVersion() < 3)
7300 {
7301 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7302 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007303
Jamie Madilld1028542013-07-02 11:57:04 -04007304 if (array == 0)
7305 {
7306 return GL_FALSE;
7307 }
7308
7309 gl::VertexArray *vao = context->getVertexArray(array);
7310
7311 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007313 }
7314 catch(std::bad_alloc&)
7315 {
7316 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7317 }
7318
7319 return GL_FALSE;
7320}
7321
7322void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7323{
7324 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7325 target, index, data);
7326
7327 try
7328 {
7329 gl::Context *context = gl::getNonLostContext();
7330
7331 if (context)
7332 {
7333 if (context->getClientVersion() < 3)
7334 {
7335 return gl::error(GL_INVALID_OPERATION);
7336 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007337
Shannon Woods15934d52013-08-19 14:28:49 -04007338 switch (target)
7339 {
7340 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7341 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7342 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7343 if (index >= context->getMaxTransformFeedbackBufferBindings())
7344 return gl::error(GL_INVALID_VALUE);
7345 break;
7346 case GL_UNIFORM_BUFFER_START:
7347 case GL_UNIFORM_BUFFER_SIZE:
7348 case GL_UNIFORM_BUFFER_BINDING:
7349 if (index >= context->getMaximumCombinedUniformBufferBindings())
7350 return gl::error(GL_INVALID_VALUE);
7351 break;
7352 default:
7353 return gl::error(GL_INVALID_ENUM);
7354 }
7355
7356 if (!(context->getIndexedIntegerv(target, index, data)))
7357 {
7358 GLenum nativeType;
7359 unsigned int numParams = 0;
7360 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7361 return gl::error(GL_INVALID_ENUM);
7362
7363 if (numParams == 0)
7364 return; // it is known that pname is valid, but there are no parameters to return
7365
7366 if (nativeType == GL_INT_64_ANGLEX)
7367 {
7368 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7369 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7370 GLint64 *int64Params = new GLint64[numParams];
7371
7372 context->getIndexedInteger64v(target, index, int64Params);
7373
7374 for (unsigned int i = 0; i < numParams; ++i)
7375 {
7376 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7377 data[i] = static_cast<GLint>(clampedValue);
7378 }
7379
7380 delete [] int64Params;
7381 }
7382 else
7383 {
7384 UNREACHABLE();
7385 }
7386 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007387 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007388 }
7389 catch(std::bad_alloc&)
7390 {
7391 return gl::error(GL_OUT_OF_MEMORY);
7392 }
7393}
7394
7395void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7396{
7397 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7398
7399 try
7400 {
7401 gl::Context *context = gl::getNonLostContext();
7402
7403 if (context)
7404 {
7405 if (context->getClientVersion() < 3)
7406 {
7407 return gl::error(GL_INVALID_OPERATION);
7408 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007409
Geoff Langc8058452014-02-03 12:04:11 -05007410 switch (primitiveMode)
7411 {
7412 case GL_TRIANGLES:
7413 case GL_LINES:
7414 case GL_POINTS:
7415 break;
7416 default:
7417 return gl::error(GL_INVALID_ENUM);
7418 }
7419
7420 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7421 ASSERT(transformFeedback != NULL);
7422
7423 if (transformFeedback->isStarted())
7424 {
7425 return gl::error(GL_INVALID_OPERATION);
7426 }
7427
7428 if (transformFeedback->isPaused())
7429 {
7430 transformFeedback->resume();
7431 }
7432 else
7433 {
7434 transformFeedback->start(primitiveMode);
7435 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007437 }
7438 catch(std::bad_alloc&)
7439 {
7440 return gl::error(GL_OUT_OF_MEMORY);
7441 }
7442}
7443
7444void __stdcall glEndTransformFeedback(void)
7445{
7446 EVENT("(void)");
7447
7448 try
7449 {
7450 gl::Context *context = gl::getNonLostContext();
7451
7452 if (context)
7453 {
7454 if (context->getClientVersion() < 3)
7455 {
7456 return gl::error(GL_INVALID_OPERATION);
7457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007458
Geoff Langc8058452014-02-03 12:04:11 -05007459 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7460 ASSERT(transformFeedback != NULL);
7461
7462 if (!transformFeedback->isStarted())
7463 {
7464 return gl::error(GL_INVALID_OPERATION);
7465 }
7466
7467 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007469 }
7470 catch(std::bad_alloc&)
7471 {
7472 return gl::error(GL_OUT_OF_MEMORY);
7473 }
7474}
7475
7476void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7477{
7478 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7479 target, index, buffer, offset, size);
7480
7481 try
7482 {
7483 gl::Context *context = gl::getNonLostContext();
7484
7485 if (context)
7486 {
7487 if (context->getClientVersion() < 3)
7488 {
7489 return gl::error(GL_INVALID_OPERATION);
7490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007492 switch (target)
7493 {
7494 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007495 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007496 {
7497 return gl::error(GL_INVALID_VALUE);
7498 }
7499 break;
7500
7501 case GL_UNIFORM_BUFFER:
7502 if (index >= context->getMaximumCombinedUniformBufferBindings())
7503 {
7504 return gl::error(GL_INVALID_VALUE);
7505 }
7506 break;
7507
7508 default:
7509 return gl::error(GL_INVALID_ENUM);
7510 }
7511
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007512 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007513 {
7514 return gl::error(GL_INVALID_VALUE);
7515 }
7516
7517 switch (target)
7518 {
7519 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007520
7521 // size and offset must be a multiple of 4
7522 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7523 {
7524 return gl::error(GL_INVALID_VALUE);
7525 }
7526
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007527 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7528 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007529 break;
7530
7531 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007532
7533 // it is an error to bind an offset not a multiple of the alignment
7534 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7535 {
7536 return gl::error(GL_INVALID_VALUE);
7537 }
7538
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007539 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7540 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007541 break;
7542
7543 default:
7544 UNREACHABLE();
7545 }
7546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007547 }
7548 catch(std::bad_alloc&)
7549 {
7550 return gl::error(GL_OUT_OF_MEMORY);
7551 }
7552}
7553
7554void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7555{
7556 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7557 target, index, buffer);
7558
7559 try
7560 {
7561 gl::Context *context = gl::getNonLostContext();
7562
7563 if (context)
7564 {
7565 if (context->getClientVersion() < 3)
7566 {
7567 return gl::error(GL_INVALID_OPERATION);
7568 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007569
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007570 switch (target)
7571 {
7572 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007573 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007574 {
7575 return gl::error(GL_INVALID_VALUE);
7576 }
7577 break;
7578
7579 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007580 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007581 {
7582 return gl::error(GL_INVALID_VALUE);
7583 }
7584 break;
7585
7586 default:
7587 return gl::error(GL_INVALID_ENUM);
7588 }
7589
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007590 switch (target)
7591 {
7592 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007593 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007594 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007595 break;
7596
7597 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007598 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007599 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007600 break;
7601
7602 default:
7603 UNREACHABLE();
7604 }
7605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007606 }
7607 catch(std::bad_alloc&)
7608 {
7609 return gl::error(GL_OUT_OF_MEMORY);
7610 }
7611}
7612
7613void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7614{
7615 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7616 program, count, varyings, bufferMode);
7617
7618 try
7619 {
7620 gl::Context *context = gl::getNonLostContext();
7621
7622 if (context)
7623 {
7624 if (context->getClientVersion() < 3)
7625 {
7626 return gl::error(GL_INVALID_OPERATION);
7627 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007628
Geoff Lang48dcae72014-02-05 16:28:24 -05007629 if (count < 0)
7630 {
7631 return gl::error(GL_INVALID_VALUE);
7632 }
7633
7634 switch (bufferMode)
7635 {
7636 case GL_INTERLEAVED_ATTRIBS:
7637 break;
7638 case GL_SEPARATE_ATTRIBS:
7639 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7640 {
7641 return gl::error(GL_INVALID_VALUE);
7642 }
7643 break;
7644 default:
7645 return gl::error(GL_INVALID_ENUM);
7646 }
7647
7648 if (!gl::ValidProgram(context, program))
7649 {
7650 return;
7651 }
7652
7653 gl::Program *programObject = context->getProgram(program);
7654 ASSERT(programObject);
7655
7656 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007658 }
7659 catch(std::bad_alloc&)
7660 {
7661 return gl::error(GL_OUT_OF_MEMORY);
7662 }
7663}
7664
7665void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7666{
7667 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7668 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7669 program, index, bufSize, length, size, type, name);
7670
7671 try
7672 {
7673 gl::Context *context = gl::getNonLostContext();
7674
7675 if (context)
7676 {
7677 if (context->getClientVersion() < 3)
7678 {
7679 return gl::error(GL_INVALID_OPERATION);
7680 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007681
Geoff Lang48dcae72014-02-05 16:28:24 -05007682 if (bufSize < 0)
7683 {
7684 return gl::error(GL_INVALID_VALUE);
7685 }
7686
7687 if (!gl::ValidProgram(context, program))
7688 {
7689 return;
7690 }
7691
7692 gl::Program *programObject = context->getProgram(program);
7693 ASSERT(programObject);
7694
7695 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7696 {
7697 return gl::error(GL_INVALID_VALUE);
7698 }
7699
7700 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007701 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007702 }
7703 catch(std::bad_alloc&)
7704 {
7705 return gl::error(GL_OUT_OF_MEMORY);
7706 }
7707}
7708
7709void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7710{
7711 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7712 index, size, type, stride, pointer);
7713
7714 try
7715 {
7716 gl::Context *context = gl::getNonLostContext();
7717
7718 if (context)
7719 {
7720 if (context->getClientVersion() < 3)
7721 {
7722 return gl::error(GL_INVALID_OPERATION);
7723 }
7724 }
7725
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007726 if (index >= gl::MAX_VERTEX_ATTRIBS)
7727 {
7728 return gl::error(GL_INVALID_VALUE);
7729 }
7730
7731 if (size < 1 || size > 4)
7732 {
7733 return gl::error(GL_INVALID_VALUE);
7734 }
7735
7736 switch (type)
7737 {
7738 case GL_BYTE:
7739 case GL_UNSIGNED_BYTE:
7740 case GL_SHORT:
7741 case GL_UNSIGNED_SHORT:
7742 case GL_INT:
7743 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007744 case GL_INT_2_10_10_10_REV:
7745 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007746 break;
7747 default:
7748 return gl::error(GL_INVALID_ENUM);
7749 }
7750
7751 if (stride < 0)
7752 {
7753 return gl::error(GL_INVALID_VALUE);
7754 }
7755
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007756 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7757 {
7758 return gl::error(GL_INVALID_OPERATION);
7759 }
7760
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007761 if (context)
7762 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007763 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7764 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7765 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7766 // and the pointer argument is not NULL.
7767 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7768 {
7769 return gl::error(GL_INVALID_OPERATION);
7770 }
7771
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007772 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7773 stride, pointer);
7774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007775 }
7776 catch(std::bad_alloc&)
7777 {
7778 return gl::error(GL_OUT_OF_MEMORY);
7779 }
7780}
7781
7782void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7783{
7784 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7785 index, pname, params);
7786
7787 try
7788 {
7789 gl::Context *context = gl::getNonLostContext();
7790
7791 if (context)
7792 {
7793 if (context->getClientVersion() < 3)
7794 {
7795 return gl::error(GL_INVALID_OPERATION);
7796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007797
Jamie Madilla7d05862013-07-02 11:57:06 -04007798 if (index >= gl::MAX_VERTEX_ATTRIBS)
7799 {
7800 return gl::error(GL_INVALID_VALUE);
7801 }
7802
7803 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7804
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007805 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007806 {
7807 return;
7808 }
7809
7810 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7811 {
7812 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7813 for (int i = 0; i < 4; ++i)
7814 {
7815 params[i] = currentValueData.IntValues[i];
7816 }
7817 }
7818 else
7819 {
7820 *params = attribState.querySingleParameter<GLint>(pname);
7821 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007823 }
7824 catch(std::bad_alloc&)
7825 {
7826 return gl::error(GL_OUT_OF_MEMORY);
7827 }
7828}
7829
7830void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7831{
7832 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7833 index, pname, params);
7834
7835 try
7836 {
7837 gl::Context *context = gl::getNonLostContext();
7838
7839 if (context)
7840 {
7841 if (context->getClientVersion() < 3)
7842 {
7843 return gl::error(GL_INVALID_OPERATION);
7844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007845
Jamie Madilla7d05862013-07-02 11:57:06 -04007846 if (index >= gl::MAX_VERTEX_ATTRIBS)
7847 {
7848 return gl::error(GL_INVALID_VALUE);
7849 }
7850
7851 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7852
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007853 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007854 {
7855 return;
7856 }
7857
7858 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7859 {
7860 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7861 for (int i = 0; i < 4; ++i)
7862 {
7863 params[i] = currentValueData.UnsignedIntValues[i];
7864 }
7865 }
7866 else
7867 {
7868 *params = attribState.querySingleParameter<GLuint>(pname);
7869 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007871 }
7872 catch(std::bad_alloc&)
7873 {
7874 return gl::error(GL_OUT_OF_MEMORY);
7875 }
7876}
7877
7878void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7879{
7880 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7881 index, x, y, z, w);
7882
7883 try
7884 {
7885 gl::Context *context = gl::getNonLostContext();
7886
7887 if (context)
7888 {
7889 if (context->getClientVersion() < 3)
7890 {
7891 return gl::error(GL_INVALID_OPERATION);
7892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007893
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007894 if (index >= gl::MAX_VERTEX_ATTRIBS)
7895 {
7896 return gl::error(GL_INVALID_VALUE);
7897 }
7898
7899 GLint vals[4] = { x, y, z, w };
7900 context->setVertexAttribi(index, vals);
7901 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007902 }
7903 catch(std::bad_alloc&)
7904 {
7905 return gl::error(GL_OUT_OF_MEMORY);
7906 }
7907}
7908
7909void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7910{
7911 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7912 index, x, y, z, w);
7913
7914 try
7915 {
7916 gl::Context *context = gl::getNonLostContext();
7917
7918 if (context)
7919 {
7920 if (context->getClientVersion() < 3)
7921 {
7922 return gl::error(GL_INVALID_OPERATION);
7923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007924
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007925 if (index >= gl::MAX_VERTEX_ATTRIBS)
7926 {
7927 return gl::error(GL_INVALID_VALUE);
7928 }
7929
7930 GLuint vals[4] = { x, y, z, w };
7931 context->setVertexAttribu(index, vals);
7932 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007933 }
7934 catch(std::bad_alloc&)
7935 {
7936 return gl::error(GL_OUT_OF_MEMORY);
7937 }
7938}
7939
7940void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7941{
7942 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7943
7944 try
7945 {
7946 gl::Context *context = gl::getNonLostContext();
7947
7948 if (context)
7949 {
7950 if (context->getClientVersion() < 3)
7951 {
7952 return gl::error(GL_INVALID_OPERATION);
7953 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007954
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007955 if (index >= gl::MAX_VERTEX_ATTRIBS)
7956 {
7957 return gl::error(GL_INVALID_VALUE);
7958 }
7959
7960 context->setVertexAttribi(index, v);
7961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007962 }
7963 catch(std::bad_alloc&)
7964 {
7965 return gl::error(GL_OUT_OF_MEMORY);
7966 }
7967}
7968
7969void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7970{
7971 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7972
7973 try
7974 {
7975 gl::Context *context = gl::getNonLostContext();
7976
7977 if (context)
7978 {
7979 if (context->getClientVersion() < 3)
7980 {
7981 return gl::error(GL_INVALID_OPERATION);
7982 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007983
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007984 if (index >= gl::MAX_VERTEX_ATTRIBS)
7985 {
7986 return gl::error(GL_INVALID_VALUE);
7987 }
7988
7989 context->setVertexAttribu(index, v);
7990 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007991 }
7992 catch(std::bad_alloc&)
7993 {
7994 return gl::error(GL_OUT_OF_MEMORY);
7995 }
7996}
7997
7998void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7999{
8000 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8001 program, location, params);
8002
8003 try
8004 {
8005 gl::Context *context = gl::getNonLostContext();
8006
8007 if (context)
8008 {
8009 if (context->getClientVersion() < 3)
8010 {
8011 return gl::error(GL_INVALID_OPERATION);
8012 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008013
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008014 if (program == 0)
8015 {
8016 return gl::error(GL_INVALID_VALUE);
8017 }
8018
8019 gl::Program *programObject = context->getProgram(program);
8020
8021 if (!programObject || !programObject->isLinked())
8022 {
8023 return gl::error(GL_INVALID_OPERATION);
8024 }
8025
8026 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8027 if (!programBinary)
8028 {
8029 return gl::error(GL_INVALID_OPERATION);
8030 }
8031
8032 if (!programBinary->getUniformuiv(location, NULL, params))
8033 {
8034 return gl::error(GL_INVALID_OPERATION);
8035 }
8036 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008037 }
8038 catch(std::bad_alloc&)
8039 {
8040 return gl::error(GL_OUT_OF_MEMORY);
8041 }
8042}
8043
8044GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8045{
8046 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8047 program, name);
8048
8049 try
8050 {
8051 gl::Context *context = gl::getNonLostContext();
8052
8053 if (context)
8054 {
8055 if (context->getClientVersion() < 3)
8056 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008057 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008059
Jamie Madilld1e78c92013-06-20 11:55:50 -04008060 if (program == 0)
8061 {
8062 return gl::error(GL_INVALID_VALUE, -1);
8063 }
8064
8065 gl::Program *programObject = context->getProgram(program);
8066
8067 if (!programObject || !programObject->isLinked())
8068 {
8069 return gl::error(GL_INVALID_OPERATION, -1);
8070 }
8071
8072 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8073 if (!programBinary)
8074 {
8075 return gl::error(GL_INVALID_OPERATION, -1);
8076 }
8077
8078 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008080 }
8081 catch(std::bad_alloc&)
8082 {
8083 return gl::error(GL_OUT_OF_MEMORY, 0);
8084 }
8085
8086 return 0;
8087}
8088
8089void __stdcall glUniform1ui(GLint location, GLuint v0)
8090{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008091 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008092}
8093
8094void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8095{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008096 const GLuint xy[] = { v0, v1 };
8097 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008098}
8099
8100void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8101{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008102 const GLuint xyz[] = { v0, v1, v2 };
8103 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008104}
8105
8106void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8107{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008108 const GLuint xyzw[] = { v0, v1, v2, v3 };
8109 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008110}
8111
8112void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8113{
8114 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8115 location, count, value);
8116
8117 try
8118 {
8119 gl::Context *context = gl::getNonLostContext();
8120
8121 if (context)
8122 {
8123 if (context->getClientVersion() < 3)
8124 {
8125 return gl::error(GL_INVALID_OPERATION);
8126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008127
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008128 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8129 if (!programBinary)
8130 {
8131 return gl::error(GL_INVALID_OPERATION);
8132 }
8133
8134 if (!programBinary->setUniform1uiv(location, count, value))
8135 {
8136 return gl::error(GL_INVALID_OPERATION);
8137 }
8138 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008139 }
8140 catch(std::bad_alloc&)
8141 {
8142 return gl::error(GL_OUT_OF_MEMORY);
8143 }
8144}
8145
8146void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8147{
8148 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8149 location, count, value);
8150
8151 try
8152 {
8153 gl::Context *context = gl::getNonLostContext();
8154
8155 if (context)
8156 {
8157 if (context->getClientVersion() < 3)
8158 {
8159 return gl::error(GL_INVALID_OPERATION);
8160 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008161
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008162 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8163 if (!programBinary)
8164 {
8165 return gl::error(GL_INVALID_OPERATION);
8166 }
8167
8168 if (!programBinary->setUniform2uiv(location, count, value))
8169 {
8170 return gl::error(GL_INVALID_OPERATION);
8171 }
8172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008173 }
8174 catch(std::bad_alloc&)
8175 {
8176 return gl::error(GL_OUT_OF_MEMORY);
8177 }
8178}
8179
8180void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8181{
8182 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8183 location, count, value);
8184
8185 try
8186 {
8187 gl::Context *context = gl::getNonLostContext();
8188
8189 if (context)
8190 {
8191 if (context->getClientVersion() < 3)
8192 {
8193 return gl::error(GL_INVALID_OPERATION);
8194 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008195
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008196 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8197 if (!programBinary)
8198 {
8199 return gl::error(GL_INVALID_OPERATION);
8200 }
8201
8202 if (!programBinary->setUniform3uiv(location, count, value))
8203 {
8204 return gl::error(GL_INVALID_OPERATION);
8205 }
8206 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008207 }
8208 catch(std::bad_alloc&)
8209 {
8210 return gl::error(GL_OUT_OF_MEMORY);
8211 }
8212}
8213
8214void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8215{
8216 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8217 location, count, value);
8218
8219 try
8220 {
8221 gl::Context *context = gl::getNonLostContext();
8222
8223 if (context)
8224 {
8225 if (context->getClientVersion() < 3)
8226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008229
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008230 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8231 if (!programBinary)
8232 {
8233 return gl::error(GL_INVALID_OPERATION);
8234 }
8235
8236 if (!programBinary->setUniform4uiv(location, count, value))
8237 {
8238 return gl::error(GL_INVALID_OPERATION);
8239 }
8240 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008241 }
8242 catch(std::bad_alloc&)
8243 {
8244 return gl::error(GL_OUT_OF_MEMORY);
8245 }
8246}
8247
8248void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8249{
8250 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8251 buffer, drawbuffer, value);
8252
8253 try
8254 {
8255 gl::Context *context = gl::getNonLostContext();
8256
8257 if (context)
8258 {
8259 if (context->getClientVersion() < 3)
8260 {
8261 return gl::error(GL_INVALID_OPERATION);
8262 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008263
Geoff Lang42359ca2013-08-21 13:25:17 -04008264 switch (buffer)
8265 {
8266 case GL_COLOR:
8267 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8268 {
8269 return gl::error(GL_INVALID_VALUE);
8270 }
8271 break;
8272 case GL_STENCIL:
8273 if (drawbuffer != 0)
8274 {
8275 return gl::error(GL_INVALID_VALUE);
8276 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008277 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008278 default:
8279 return gl::error(GL_INVALID_ENUM);
8280 }
8281
8282 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008283 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008284 }
8285 catch(std::bad_alloc&)
8286 {
8287 return gl::error(GL_OUT_OF_MEMORY);
8288 }
8289}
8290
8291void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8292{
8293 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8294 buffer, drawbuffer, value);
8295
8296 try
8297 {
8298 gl::Context *context = gl::getNonLostContext();
8299
8300 if (context)
8301 {
8302 if (context->getClientVersion() < 3)
8303 {
8304 return gl::error(GL_INVALID_OPERATION);
8305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008306
Geoff Lang42359ca2013-08-21 13:25:17 -04008307 switch (buffer)
8308 {
8309 case GL_COLOR:
8310 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8311 {
8312 return gl::error(GL_INVALID_VALUE);
8313 }
8314 break;
8315 default:
8316 return gl::error(GL_INVALID_ENUM);
8317 }
8318
8319 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008320 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008321 }
8322 catch(std::bad_alloc&)
8323 {
8324 return gl::error(GL_OUT_OF_MEMORY);
8325 }
8326}
8327
8328void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8329{
8330 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8331 buffer, drawbuffer, value);
8332
8333 try
8334 {
8335 gl::Context *context = gl::getNonLostContext();
8336
8337 if (context)
8338 {
8339 if (context->getClientVersion() < 3)
8340 {
8341 return gl::error(GL_INVALID_OPERATION);
8342 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008343
Geoff Lang42359ca2013-08-21 13:25:17 -04008344 switch (buffer)
8345 {
8346 case GL_COLOR:
8347 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8348 {
8349 return gl::error(GL_INVALID_VALUE);
8350 }
8351 break;
8352 case GL_DEPTH:
8353 if (drawbuffer != 0)
8354 {
8355 return gl::error(GL_INVALID_VALUE);
8356 }
8357 break;
8358 default:
8359 return gl::error(GL_INVALID_ENUM);
8360 }
8361
8362 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008364 }
8365 catch(std::bad_alloc&)
8366 {
8367 return gl::error(GL_OUT_OF_MEMORY);
8368 }
8369}
8370
8371void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8372{
8373 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8374 buffer, drawbuffer, depth, stencil);
8375
8376 try
8377 {
8378 gl::Context *context = gl::getNonLostContext();
8379
8380 if (context)
8381 {
8382 if (context->getClientVersion() < 3)
8383 {
8384 return gl::error(GL_INVALID_OPERATION);
8385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008386
Geoff Lang42359ca2013-08-21 13:25:17 -04008387 switch (buffer)
8388 {
8389 case GL_DEPTH_STENCIL:
8390 if (drawbuffer != 0)
8391 {
8392 return gl::error(GL_INVALID_VALUE);
8393 }
8394 break;
8395 default:
8396 return gl::error(GL_INVALID_ENUM);
8397 }
8398
8399 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008401 }
8402 catch(std::bad_alloc&)
8403 {
8404 return gl::error(GL_OUT_OF_MEMORY);
8405 }
8406}
8407
8408const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8409{
8410 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8411
8412 try
8413 {
8414 gl::Context *context = gl::getNonLostContext();
8415
8416 if (context)
8417 {
8418 if (context->getClientVersion() < 3)
8419 {
8420 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8421 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008422
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008423 if (name != GL_EXTENSIONS)
8424 {
8425 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8426 }
8427
8428 if (index >= context->getNumExtensions())
8429 {
8430 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8431 }
8432
8433 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008435 }
8436 catch(std::bad_alloc&)
8437 {
8438 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8439 }
8440
8441 return NULL;
8442}
8443
8444void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8445{
8446 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8447 readTarget, writeTarget, readOffset, writeOffset, size);
8448
8449 try
8450 {
8451 gl::Context *context = gl::getNonLostContext();
8452
8453 if (context)
8454 {
8455 if (context->getClientVersion() < 3)
8456 {
8457 return gl::error(GL_INVALID_OPERATION);
8458 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008459
Jamie Madill8c96d582014-03-05 15:01:23 -05008460 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008461 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008462 return gl::error(GL_INVALID_ENUM);
8463 }
8464
Jamie Madill8c96d582014-03-05 15:01:23 -05008465 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8466 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008467
8468 if (!readBuffer || !writeBuffer)
8469 {
8470 return gl::error(GL_INVALID_OPERATION);
8471 }
8472
Jamie Madill7a5f7382014-03-05 15:01:24 -05008473 if (readBuffer->mapped() || writeBuffer->mapped())
8474 {
8475 return gl::error(GL_INVALID_OPERATION);
8476 }
8477
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008478 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8479 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8480 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8481 {
8482 return gl::error(GL_INVALID_VALUE);
8483 }
8484
8485 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8486 {
8487 return gl::error(GL_INVALID_VALUE);
8488 }
8489
8490 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8491
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008492 // if size is zero, the copy is a successful no-op
8493 if (size > 0)
8494 {
8495 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8496 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008497 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008498 }
8499 catch(std::bad_alloc&)
8500 {
8501 return gl::error(GL_OUT_OF_MEMORY);
8502 }
8503}
8504
8505void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8506{
8507 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8508 program, uniformCount, uniformNames, uniformIndices);
8509
8510 try
8511 {
8512 gl::Context *context = gl::getNonLostContext();
8513
8514 if (context)
8515 {
8516 if (context->getClientVersion() < 3)
8517 {
8518 return gl::error(GL_INVALID_OPERATION);
8519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008520
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008521 if (uniformCount < 0)
8522 {
8523 return gl::error(GL_INVALID_VALUE);
8524 }
8525
8526 gl::Program *programObject = context->getProgram(program);
8527
8528 if (!programObject)
8529 {
8530 if (context->getShader(program))
8531 {
8532 return gl::error(GL_INVALID_OPERATION);
8533 }
8534 else
8535 {
8536 return gl::error(GL_INVALID_VALUE);
8537 }
8538 }
8539
8540 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8541 if (!programObject->isLinked() || !programBinary)
8542 {
8543 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8544 {
8545 uniformIndices[uniformId] = GL_INVALID_INDEX;
8546 }
8547 }
8548 else
8549 {
8550 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8551 {
8552 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8553 }
8554 }
8555 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008556 }
8557 catch(std::bad_alloc&)
8558 {
8559 return gl::error(GL_OUT_OF_MEMORY);
8560 }
8561}
8562
8563void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8564{
8565 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8566 program, uniformCount, uniformIndices, pname, params);
8567
8568 try
8569 {
8570 gl::Context *context = gl::getNonLostContext();
8571
8572 if (context)
8573 {
8574 if (context->getClientVersion() < 3)
8575 {
8576 return gl::error(GL_INVALID_OPERATION);
8577 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008578
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008579 if (uniformCount < 0)
8580 {
8581 return gl::error(GL_INVALID_VALUE);
8582 }
8583
8584 gl::Program *programObject = context->getProgram(program);
8585
8586 if (!programObject)
8587 {
8588 if (context->getShader(program))
8589 {
8590 return gl::error(GL_INVALID_OPERATION);
8591 }
8592 else
8593 {
8594 return gl::error(GL_INVALID_VALUE);
8595 }
8596 }
8597
8598 switch (pname)
8599 {
8600 case GL_UNIFORM_TYPE:
8601 case GL_UNIFORM_SIZE:
8602 case GL_UNIFORM_NAME_LENGTH:
8603 case GL_UNIFORM_BLOCK_INDEX:
8604 case GL_UNIFORM_OFFSET:
8605 case GL_UNIFORM_ARRAY_STRIDE:
8606 case GL_UNIFORM_MATRIX_STRIDE:
8607 case GL_UNIFORM_IS_ROW_MAJOR:
8608 break;
8609 default:
8610 return gl::error(GL_INVALID_ENUM);
8611 }
8612
8613 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8614
8615 if (!programBinary && uniformCount > 0)
8616 {
8617 return gl::error(GL_INVALID_VALUE);
8618 }
8619
8620 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8621 {
8622 const GLuint index = uniformIndices[uniformId];
8623
8624 if (index >= (GLuint)programBinary->getActiveUniformCount())
8625 {
8626 return gl::error(GL_INVALID_VALUE);
8627 }
8628 }
8629
8630 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8631 {
8632 const GLuint index = uniformIndices[uniformId];
8633 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8634 }
8635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008636 }
8637 catch(std::bad_alloc&)
8638 {
8639 return gl::error(GL_OUT_OF_MEMORY);
8640 }
8641}
8642
8643GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8644{
8645 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8646
8647 try
8648 {
8649 gl::Context *context = gl::getNonLostContext();
8650
8651 if (context)
8652 {
8653 if (context->getClientVersion() < 3)
8654 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008655 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008657
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008658 gl::Program *programObject = context->getProgram(program);
8659
8660 if (!programObject)
8661 {
8662 if (context->getShader(program))
8663 {
8664 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8665 }
8666 else
8667 {
8668 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8669 }
8670 }
8671
8672 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8673 if (!programBinary)
8674 {
8675 return GL_INVALID_INDEX;
8676 }
8677
8678 return programBinary->getUniformBlockIndex(uniformBlockName);
8679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008680 }
8681 catch(std::bad_alloc&)
8682 {
8683 return gl::error(GL_OUT_OF_MEMORY, 0);
8684 }
8685
8686 return 0;
8687}
8688
8689void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8690{
8691 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8692 program, uniformBlockIndex, pname, params);
8693
8694 try
8695 {
8696 gl::Context *context = gl::getNonLostContext();
8697
8698 if (context)
8699 {
8700 if (context->getClientVersion() < 3)
8701 {
8702 return gl::error(GL_INVALID_OPERATION);
8703 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008704 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008705
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008706 if (!programObject)
8707 {
8708 if (context->getShader(program))
8709 {
8710 return gl::error(GL_INVALID_OPERATION);
8711 }
8712 else
8713 {
8714 return gl::error(GL_INVALID_VALUE);
8715 }
8716 }
8717
8718 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8719
8720 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8721 {
8722 return gl::error(GL_INVALID_VALUE);
8723 }
8724
8725 switch (pname)
8726 {
8727 case GL_UNIFORM_BLOCK_BINDING:
8728 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8729 break;
8730
8731 case GL_UNIFORM_BLOCK_DATA_SIZE:
8732 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8733 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8734 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8735 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8736 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8737 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8738 break;
8739
8740 default:
8741 return gl::error(GL_INVALID_ENUM);
8742 }
8743 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008744 }
8745 catch(std::bad_alloc&)
8746 {
8747 return gl::error(GL_OUT_OF_MEMORY);
8748 }
8749}
8750
8751void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8752{
8753 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8754 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8755
8756 try
8757 {
8758 gl::Context *context = gl::getNonLostContext();
8759
8760 if (context)
8761 {
8762 if (context->getClientVersion() < 3)
8763 {
8764 return gl::error(GL_INVALID_OPERATION);
8765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008766
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008767 gl::Program *programObject = context->getProgram(program);
8768
8769 if (!programObject)
8770 {
8771 if (context->getShader(program))
8772 {
8773 return gl::error(GL_INVALID_OPERATION);
8774 }
8775 else
8776 {
8777 return gl::error(GL_INVALID_VALUE);
8778 }
8779 }
8780
8781 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8782
8783 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8784 {
8785 return gl::error(GL_INVALID_VALUE);
8786 }
8787
8788 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8789 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008790 }
8791 catch(std::bad_alloc&)
8792 {
8793 return gl::error(GL_OUT_OF_MEMORY);
8794 }
8795}
8796
8797void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8798{
8799 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8800 program, uniformBlockIndex, uniformBlockBinding);
8801
8802 try
8803 {
8804 gl::Context *context = gl::getNonLostContext();
8805
8806 if (context)
8807 {
8808 if (context->getClientVersion() < 3)
8809 {
8810 return gl::error(GL_INVALID_OPERATION);
8811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008812
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008813 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8814 {
8815 return gl::error(GL_INVALID_VALUE);
8816 }
8817
8818 gl::Program *programObject = context->getProgram(program);
8819
8820 if (!programObject)
8821 {
8822 if (context->getShader(program))
8823 {
8824 return gl::error(GL_INVALID_OPERATION);
8825 }
8826 else
8827 {
8828 return gl::error(GL_INVALID_VALUE);
8829 }
8830 }
8831
8832 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8833
8834 // if never linked, there won't be any uniform blocks
8835 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8836 {
8837 return gl::error(GL_INVALID_VALUE);
8838 }
8839
8840 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008842 }
8843 catch(std::bad_alloc&)
8844 {
8845 return gl::error(GL_OUT_OF_MEMORY);
8846 }
8847}
8848
8849void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8850{
8851 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8852 mode, first, count, instanceCount);
8853
8854 try
8855 {
8856 gl::Context *context = gl::getNonLostContext();
8857
8858 if (context)
8859 {
8860 if (context->getClientVersion() < 3)
8861 {
8862 return gl::error(GL_INVALID_OPERATION);
8863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008864
Jamie Madill54133512013-06-21 09:33:07 -04008865 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008866 UNIMPLEMENTED();
8867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008868 }
8869 catch(std::bad_alloc&)
8870 {
8871 return gl::error(GL_OUT_OF_MEMORY);
8872 }
8873}
8874
8875void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8876{
8877 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8878 mode, count, type, indices, instanceCount);
8879
8880 try
8881 {
8882 gl::Context *context = gl::getNonLostContext();
8883
8884 if (context)
8885 {
8886 if (context->getClientVersion() < 3)
8887 {
8888 return gl::error(GL_INVALID_OPERATION);
8889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008890
Jamie Madill54133512013-06-21 09:33:07 -04008891 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008892 UNIMPLEMENTED();
8893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008894 }
8895 catch(std::bad_alloc&)
8896 {
8897 return gl::error(GL_OUT_OF_MEMORY);
8898 }
8899}
8900
8901GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8902{
8903 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8904
8905 try
8906 {
8907 gl::Context *context = gl::getNonLostContext();
8908
8909 if (context)
8910 {
8911 if (context->getClientVersion() < 3)
8912 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008913 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008914 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008915
Jamie Madill5215e1a2013-07-26 11:55:19 -04008916 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8917 {
8918 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8919 }
8920
8921 if (flags != 0)
8922 {
8923 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8924 }
8925
8926 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008928 }
8929 catch(std::bad_alloc&)
8930 {
8931 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8932 }
8933
8934 return NULL;
8935}
8936
8937GLboolean __stdcall glIsSync(GLsync sync)
8938{
8939 EVENT("(GLsync sync = 0x%0.8p)", sync);
8940
8941 try
8942 {
8943 gl::Context *context = gl::getNonLostContext();
8944
8945 if (context)
8946 {
8947 if (context->getClientVersion() < 3)
8948 {
8949 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008951
Jamie Madill5215e1a2013-07-26 11:55:19 -04008952 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008953 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008954 }
8955 catch(std::bad_alloc&)
8956 {
8957 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8958 }
8959
8960 return GL_FALSE;
8961}
8962
8963void __stdcall glDeleteSync(GLsync sync)
8964{
8965 EVENT("(GLsync sync = 0x%0.8p)", sync);
8966
8967 try
8968 {
8969 gl::Context *context = gl::getNonLostContext();
8970
8971 if (context)
8972 {
8973 if (context->getClientVersion() < 3)
8974 {
8975 return gl::error(GL_INVALID_OPERATION);
8976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008977
Jamie Madill5215e1a2013-07-26 11:55:19 -04008978 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8979 {
8980 return gl::error(GL_INVALID_VALUE);
8981 }
8982
8983 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008985 }
8986 catch(std::bad_alloc&)
8987 {
8988 return gl::error(GL_OUT_OF_MEMORY);
8989 }
8990}
8991
8992GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8993{
8994 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8995 sync, flags, timeout);
8996
8997 try
8998 {
8999 gl::Context *context = gl::getNonLostContext();
9000
9001 if (context)
9002 {
9003 if (context->getClientVersion() < 3)
9004 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04009005 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009007
Jamie Madill5215e1a2013-07-26 11:55:19 -04009008 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
9009 {
9010 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9011 }
9012
9013 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9014
9015 if (!fenceSync)
9016 {
9017 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9018 }
9019
9020 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009021 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009022 }
9023 catch(std::bad_alloc&)
9024 {
9025 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9026 }
9027
9028 return GL_FALSE;
9029}
9030
9031void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9032{
9033 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9034 sync, flags, timeout);
9035
9036 try
9037 {
9038 gl::Context *context = gl::getNonLostContext();
9039
9040 if (context)
9041 {
9042 if (context->getClientVersion() < 3)
9043 {
9044 return gl::error(GL_INVALID_OPERATION);
9045 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009046
Jamie Madill5215e1a2013-07-26 11:55:19 -04009047 if (flags != 0)
9048 {
9049 return gl::error(GL_INVALID_VALUE);
9050 }
9051
9052 if (timeout != GL_TIMEOUT_IGNORED)
9053 {
9054 return gl::error(GL_INVALID_VALUE);
9055 }
9056
9057 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9058
9059 if (!fenceSync)
9060 {
9061 return gl::error(GL_INVALID_VALUE);
9062 }
9063
9064 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009066 }
9067 catch(std::bad_alloc&)
9068 {
9069 return gl::error(GL_OUT_OF_MEMORY);
9070 }
9071}
9072
9073void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9074{
9075 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9076 pname, params);
9077
9078 try
9079 {
9080 gl::Context *context = gl::getNonLostContext();
9081
9082 if (context)
9083 {
9084 if (context->getClientVersion() < 3)
9085 {
9086 return gl::error(GL_INVALID_OPERATION);
9087 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009088
Jamie Madill79f2f452013-12-19 11:13:02 -05009089 GLenum nativeType;
9090 unsigned int numParams = 0;
9091 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9092 return gl::error(GL_INVALID_ENUM);
9093
9094 // pname is valid, but that there are no parameters to return.
9095 if (numParams == 0)
9096 return;
9097
9098 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009099 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009100 context->getInteger64v(pname, params);
9101 }
Jamie Madill55856b12014-01-02 13:59:50 -05009102 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009103 {
Jamie Madill55856b12014-01-02 13:59:50 -05009104 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009105 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009107 }
9108 catch(std::bad_alloc&)
9109 {
9110 return gl::error(GL_OUT_OF_MEMORY);
9111 }
9112}
9113
9114void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9115{
9116 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9117 sync, pname, bufSize, length, values);
9118
9119 try
9120 {
9121 gl::Context *context = gl::getNonLostContext();
9122
9123 if (context)
9124 {
9125 if (context->getClientVersion() < 3)
9126 {
9127 return gl::error(GL_INVALID_OPERATION);
9128 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009129
Jamie Madill5215e1a2013-07-26 11:55:19 -04009130 if (bufSize < 0)
9131 {
9132 return gl::error(GL_INVALID_VALUE);
9133 }
9134
9135 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9136
9137 if (!fenceSync)
9138 {
9139 return gl::error(GL_INVALID_VALUE);
9140 }
9141
9142 switch (pname)
9143 {
9144 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9145 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9146 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9147 case GL_SYNC_FLAGS: values[0] = 0; break;
9148
9149 default:
9150 return gl::error(GL_INVALID_ENUM);
9151 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009152 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009153 }
9154 catch(std::bad_alloc&)
9155 {
9156 return gl::error(GL_OUT_OF_MEMORY);
9157 }
9158}
9159
9160void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9161{
9162 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9163 target, index, data);
9164
9165 try
9166 {
9167 gl::Context *context = gl::getNonLostContext();
9168
9169 if (context)
9170 {
9171 if (context->getClientVersion() < 3)
9172 {
9173 return gl::error(GL_INVALID_OPERATION);
9174 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009175
Shannon Woods15934d52013-08-19 14:28:49 -04009176 switch (target)
9177 {
9178 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9179 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9180 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9181 if (index >= context->getMaxTransformFeedbackBufferBindings())
9182 return gl::error(GL_INVALID_VALUE);
9183 break;
9184 case GL_UNIFORM_BUFFER_START:
9185 case GL_UNIFORM_BUFFER_SIZE:
9186 case GL_UNIFORM_BUFFER_BINDING:
9187 if (index >= context->getMaximumCombinedUniformBufferBindings())
9188 return gl::error(GL_INVALID_VALUE);
9189 break;
9190 default:
9191 return gl::error(GL_INVALID_ENUM);
9192 }
9193
9194 if (!(context->getIndexedInteger64v(target, index, data)))
9195 {
9196 GLenum nativeType;
9197 unsigned int numParams = 0;
9198 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9199 return gl::error(GL_INVALID_ENUM);
9200
9201 if (numParams == 0)
9202 return; // it is known that pname is valid, but there are no parameters to return
9203
9204 if (nativeType == GL_INT)
9205 {
9206 GLint *intParams = new GLint[numParams];
9207
9208 context->getIndexedIntegerv(target, index, intParams);
9209
9210 for (unsigned int i = 0; i < numParams; ++i)
9211 {
9212 data[i] = static_cast<GLint64>(intParams[i]);
9213 }
9214
9215 delete [] intParams;
9216 }
9217 else
9218 {
9219 UNREACHABLE();
9220 }
9221 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009223 }
9224 catch(std::bad_alloc&)
9225 {
9226 return gl::error(GL_OUT_OF_MEMORY);
9227 }
9228}
9229
9230void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9231{
9232 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9233 target, pname, params);
9234
9235 try
9236 {
9237 gl::Context *context = gl::getNonLostContext();
9238
9239 if (context)
9240 {
9241 if (context->getClientVersion() < 3)
9242 {
9243 return gl::error(GL_INVALID_OPERATION);
9244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009245
Jamie Madill70656a62014-03-05 15:01:26 -05009246 if (!gl::ValidBufferTarget(context, target))
9247 {
9248 return gl::error(GL_INVALID_ENUM);
9249 }
9250
9251 if (!gl::ValidBufferParameter(context, pname))
9252 {
9253 return gl::error(GL_INVALID_ENUM);
9254 }
9255
9256 gl::Buffer *buffer = context->getTargetBuffer(target);
9257
9258 if (!buffer)
9259 {
9260 // A null buffer means that "0" is bound to the requested buffer target
9261 return gl::error(GL_INVALID_OPERATION);
9262 }
9263
9264 switch (pname)
9265 {
9266 case GL_BUFFER_USAGE:
9267 *params = static_cast<GLint64>(buffer->usage());
9268 break;
9269 case GL_BUFFER_SIZE:
9270 *params = buffer->size();
9271 break;
9272 case GL_BUFFER_ACCESS_FLAGS:
9273 *params = static_cast<GLint64>(buffer->accessFlags());
9274 break;
9275 case GL_BUFFER_MAPPED:
9276 *params = static_cast<GLint64>(buffer->mapped());
9277 break;
9278 case GL_BUFFER_MAP_OFFSET:
9279 *params = buffer->mapOffset();
9280 break;
9281 case GL_BUFFER_MAP_LENGTH:
9282 *params = buffer->mapLength();
9283 break;
9284 default: UNREACHABLE(); break;
9285 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009287 }
9288 catch(std::bad_alloc&)
9289 {
9290 return gl::error(GL_OUT_OF_MEMORY);
9291 }
9292}
9293
9294void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9295{
9296 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9297
9298 try
9299 {
9300 gl::Context *context = gl::getNonLostContext();
9301
9302 if (context)
9303 {
9304 if (context->getClientVersion() < 3)
9305 {
9306 return gl::error(GL_INVALID_OPERATION);
9307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009309 if (count < 0)
9310 {
9311 return gl::error(GL_INVALID_VALUE);
9312 }
9313
9314 for (int i = 0; i < count; i++)
9315 {
9316 samplers[i] = context->createSampler();
9317 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009319 }
9320 catch(std::bad_alloc&)
9321 {
9322 return gl::error(GL_OUT_OF_MEMORY);
9323 }
9324}
9325
9326void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9327{
9328 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9329
9330 try
9331 {
9332 gl::Context *context = gl::getNonLostContext();
9333
9334 if (context)
9335 {
9336 if (context->getClientVersion() < 3)
9337 {
9338 return gl::error(GL_INVALID_OPERATION);
9339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009340
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009341 if (count < 0)
9342 {
9343 return gl::error(GL_INVALID_VALUE);
9344 }
9345
9346 for (int i = 0; i < count; i++)
9347 {
9348 context->deleteSampler(samplers[i]);
9349 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009350 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009351 }
9352 catch(std::bad_alloc&)
9353 {
9354 return gl::error(GL_OUT_OF_MEMORY);
9355 }
9356}
9357
9358GLboolean __stdcall glIsSampler(GLuint sampler)
9359{
9360 EVENT("(GLuint sampler = %u)", sampler);
9361
9362 try
9363 {
9364 gl::Context *context = gl::getNonLostContext();
9365
9366 if (context)
9367 {
9368 if (context->getClientVersion() < 3)
9369 {
9370 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9371 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009372
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009373 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009375 }
9376 catch(std::bad_alloc&)
9377 {
9378 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9379 }
9380
9381 return GL_FALSE;
9382}
9383
9384void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9385{
9386 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9387
9388 try
9389 {
9390 gl::Context *context = gl::getNonLostContext();
9391
9392 if (context)
9393 {
9394 if (context->getClientVersion() < 3)
9395 {
9396 return gl::error(GL_INVALID_OPERATION);
9397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009398
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009399 if (sampler != 0 && !context->isSampler(sampler))
9400 {
9401 return gl::error(GL_INVALID_OPERATION);
9402 }
9403
9404 if (unit >= context->getMaximumCombinedTextureImageUnits())
9405 {
9406 return gl::error(GL_INVALID_VALUE);
9407 }
9408
9409 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009411 }
9412 catch(std::bad_alloc&)
9413 {
9414 return gl::error(GL_OUT_OF_MEMORY);
9415 }
9416}
9417
9418void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9419{
9420 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9421
9422 try
9423 {
9424 gl::Context *context = gl::getNonLostContext();
9425
9426 if (context)
9427 {
9428 if (context->getClientVersion() < 3)
9429 {
9430 return gl::error(GL_INVALID_OPERATION);
9431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009432
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009433 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009434 {
9435 return;
9436 }
9437
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009438 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009439 {
9440 return;
9441 }
9442
9443 if (!context->isSampler(sampler))
9444 {
9445 return gl::error(GL_INVALID_OPERATION);
9446 }
9447
9448 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009450 }
9451 catch(std::bad_alloc&)
9452 {
9453 return gl::error(GL_OUT_OF_MEMORY);
9454 }
9455}
9456
9457void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9458{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009459 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009460}
9461
9462void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9463{
9464 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9465
9466 try
9467 {
9468 gl::Context *context = gl::getNonLostContext();
9469
9470 if (context)
9471 {
9472 if (context->getClientVersion() < 3)
9473 {
9474 return gl::error(GL_INVALID_OPERATION);
9475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009476
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009477 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009478 {
9479 return;
9480 }
9481
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009482 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009483 {
9484 return;
9485 }
9486
9487 if (!context->isSampler(sampler))
9488 {
9489 return gl::error(GL_INVALID_OPERATION);
9490 }
9491
9492 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009494 }
9495 catch(std::bad_alloc&)
9496 {
9497 return gl::error(GL_OUT_OF_MEMORY);
9498 }
9499}
9500
9501void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9502{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009503 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009504}
9505
9506void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9507{
9508 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9509
9510 try
9511 {
9512 gl::Context *context = gl::getNonLostContext();
9513
9514 if (context)
9515 {
9516 if (context->getClientVersion() < 3)
9517 {
9518 return gl::error(GL_INVALID_OPERATION);
9519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009520
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009521 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009522 {
9523 return;
9524 }
9525
9526 if (!context->isSampler(sampler))
9527 {
9528 return gl::error(GL_INVALID_OPERATION);
9529 }
9530
9531 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009532 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009533 }
9534 catch(std::bad_alloc&)
9535 {
9536 return gl::error(GL_OUT_OF_MEMORY);
9537 }
9538}
9539
9540void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9541{
9542 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9543
9544 try
9545 {
9546 gl::Context *context = gl::getNonLostContext();
9547
9548 if (context)
9549 {
9550 if (context->getClientVersion() < 3)
9551 {
9552 return gl::error(GL_INVALID_OPERATION);
9553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009554
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009555 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009556 {
9557 return;
9558 }
9559
9560 if (!context->isSampler(sampler))
9561 {
9562 return gl::error(GL_INVALID_OPERATION);
9563 }
9564
9565 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009566 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009567 }
9568 catch(std::bad_alloc&)
9569 {
9570 return gl::error(GL_OUT_OF_MEMORY);
9571 }
9572}
9573
9574void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9575{
9576 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9577
9578 try
9579 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009580 if (index >= gl::MAX_VERTEX_ATTRIBS)
9581 {
9582 return gl::error(GL_INVALID_VALUE);
9583 }
9584
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009585 gl::Context *context = gl::getNonLostContext();
9586
9587 if (context)
9588 {
9589 if (context->getClientVersion() < 3)
9590 {
9591 return gl::error(GL_INVALID_OPERATION);
9592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009593
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009594 context->setVertexAttribDivisor(index, divisor);
9595 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009596 }
9597 catch(std::bad_alloc&)
9598 {
9599 return gl::error(GL_OUT_OF_MEMORY);
9600 }
9601}
9602
9603void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9604{
9605 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9606
9607 try
9608 {
9609 gl::Context *context = gl::getNonLostContext();
9610
9611 if (context)
9612 {
9613 if (context->getClientVersion() < 3)
9614 {
9615 return gl::error(GL_INVALID_OPERATION);
9616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009617
Geoff Langc8058452014-02-03 12:04:11 -05009618 switch (target)
9619 {
9620 case GL_TRANSFORM_FEEDBACK:
9621 {
9622 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9623 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9624 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9625 {
9626 return gl::error(GL_INVALID_OPERATION);
9627 }
9628
9629 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9630 if (context->getTransformFeedback(id) == NULL)
9631 {
9632 return gl::error(GL_INVALID_OPERATION);
9633 }
9634
9635 context->bindTransformFeedback(id);
9636 }
9637 break;
9638
9639 default:
9640 return gl::error(GL_INVALID_ENUM);
9641 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009642 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009643 }
9644 catch(std::bad_alloc&)
9645 {
9646 return gl::error(GL_OUT_OF_MEMORY);
9647 }
9648}
9649
9650void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9651{
9652 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9653
9654 try
9655 {
9656 gl::Context *context = gl::getNonLostContext();
9657
9658 if (context)
9659 {
9660 if (context->getClientVersion() < 3)
9661 {
9662 return gl::error(GL_INVALID_OPERATION);
9663 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009664
Geoff Langc8058452014-02-03 12:04:11 -05009665 for (int i = 0; i < n; i++)
9666 {
9667 context->deleteTransformFeedback(ids[i]);
9668 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009669 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009670 }
9671 catch(std::bad_alloc&)
9672 {
9673 return gl::error(GL_OUT_OF_MEMORY);
9674 }
9675}
9676
9677void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9678{
9679 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9680
9681 try
9682 {
9683 gl::Context *context = gl::getNonLostContext();
9684
9685 if (context)
9686 {
9687 if (context->getClientVersion() < 3)
9688 {
9689 return gl::error(GL_INVALID_OPERATION);
9690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009691
Geoff Langc8058452014-02-03 12:04:11 -05009692 for (int i = 0; i < n; i++)
9693 {
9694 ids[i] = context->createTransformFeedback();
9695 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009697 }
9698 catch(std::bad_alloc&)
9699 {
9700 return gl::error(GL_OUT_OF_MEMORY);
9701 }
9702}
9703
9704GLboolean __stdcall glIsTransformFeedback(GLuint id)
9705{
9706 EVENT("(GLuint id = %u)", id);
9707
9708 try
9709 {
9710 gl::Context *context = gl::getNonLostContext();
9711
9712 if (context)
9713 {
9714 if (context->getClientVersion() < 3)
9715 {
9716 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9717 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009718
Geoff Langc8058452014-02-03 12:04:11 -05009719 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009721 }
9722 catch(std::bad_alloc&)
9723 {
9724 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9725 }
9726
9727 return GL_FALSE;
9728}
9729
9730void __stdcall glPauseTransformFeedback(void)
9731{
9732 EVENT("(void)");
9733
9734 try
9735 {
9736 gl::Context *context = gl::getNonLostContext();
9737
9738 if (context)
9739 {
9740 if (context->getClientVersion() < 3)
9741 {
9742 return gl::error(GL_INVALID_OPERATION);
9743 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009744
Geoff Langc8058452014-02-03 12:04:11 -05009745 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9746 ASSERT(transformFeedback != NULL);
9747
9748 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9749 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9750 {
9751 return gl::error(GL_INVALID_OPERATION);
9752 }
9753
9754 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009755 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009756 }
9757 catch(std::bad_alloc&)
9758 {
9759 return gl::error(GL_OUT_OF_MEMORY);
9760 }
9761}
9762
9763void __stdcall glResumeTransformFeedback(void)
9764{
9765 EVENT("(void)");
9766
9767 try
9768 {
9769 gl::Context *context = gl::getNonLostContext();
9770
9771 if (context)
9772 {
9773 if (context->getClientVersion() < 3)
9774 {
9775 return gl::error(GL_INVALID_OPERATION);
9776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009777
Geoff Langc8058452014-02-03 12:04:11 -05009778 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9779 ASSERT(transformFeedback != NULL);
9780
9781 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9782 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9783 {
9784 return gl::error(GL_INVALID_OPERATION);
9785 }
9786
9787 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009788 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009789 }
9790 catch(std::bad_alloc&)
9791 {
9792 return gl::error(GL_OUT_OF_MEMORY);
9793 }
9794}
9795
9796void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9797{
9798 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9799 program, bufSize, length, binaryFormat, binary);
9800
9801 try
9802 {
9803 gl::Context *context = gl::getNonLostContext();
9804
9805 if (context)
9806 {
9807 if (context->getClientVersion() < 3)
9808 {
9809 return gl::error(GL_INVALID_OPERATION);
9810 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009811
Jamie Madill54133512013-06-21 09:33:07 -04009812 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009813 UNIMPLEMENTED();
9814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009815 }
9816 catch(std::bad_alloc&)
9817 {
9818 return gl::error(GL_OUT_OF_MEMORY);
9819 }
9820}
9821
9822void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9823{
9824 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9825 program, binaryFormat, binary, length);
9826
9827 try
9828 {
9829 gl::Context *context = gl::getNonLostContext();
9830
9831 if (context)
9832 {
9833 if (context->getClientVersion() < 3)
9834 {
9835 return gl::error(GL_INVALID_OPERATION);
9836 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009837
Jamie Madill54133512013-06-21 09:33:07 -04009838 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009839 UNIMPLEMENTED();
9840 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009841 }
9842 catch(std::bad_alloc&)
9843 {
9844 return gl::error(GL_OUT_OF_MEMORY);
9845 }
9846}
9847
9848void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9849{
9850 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9851 program, pname, value);
9852
9853 try
9854 {
9855 gl::Context *context = gl::getNonLostContext();
9856
9857 if (context)
9858 {
9859 if (context->getClientVersion() < 3)
9860 {
9861 return gl::error(GL_INVALID_OPERATION);
9862 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009863
Jamie Madill54133512013-06-21 09:33:07 -04009864 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009865 UNIMPLEMENTED();
9866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009867 }
9868 catch(std::bad_alloc&)
9869 {
9870 return gl::error(GL_OUT_OF_MEMORY);
9871 }
9872}
9873
9874void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9875{
9876 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9877 target, numAttachments, attachments);
9878
9879 try
9880 {
9881 gl::Context *context = gl::getNonLostContext();
9882
9883 if (context)
9884 {
9885 if (context->getClientVersion() < 3)
9886 {
9887 return gl::error(GL_INVALID_OPERATION);
9888 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009889
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009890 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009891 {
9892 return;
9893 }
9894
9895 int maxDimension = context->getMaximumRenderbufferDimension();
9896 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009898 }
9899 catch(std::bad_alloc&)
9900 {
9901 return gl::error(GL_OUT_OF_MEMORY);
9902 }
9903}
9904
9905void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9906{
9907 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9908 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9909 target, numAttachments, attachments, x, y, width, height);
9910
9911 try
9912 {
9913 gl::Context *context = gl::getNonLostContext();
9914
9915 if (context)
9916 {
9917 if (context->getClientVersion() < 3)
9918 {
9919 return gl::error(GL_INVALID_OPERATION);
9920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009921
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009922 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009923 {
9924 return;
9925 }
9926
9927 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009929 }
9930 catch(std::bad_alloc&)
9931 {
9932 return gl::error(GL_OUT_OF_MEMORY);
9933 }
9934}
9935
9936void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9937{
9938 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9939 target, levels, internalformat, width, height);
9940
9941 try
9942 {
9943 gl::Context *context = gl::getNonLostContext();
9944
9945 if (context)
9946 {
9947 if (context->getClientVersion() < 3)
9948 {
9949 return gl::error(GL_INVALID_OPERATION);
9950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009951
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009952 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009953 {
9954 return;
9955 }
9956
9957 switch (target)
9958 {
9959 case GL_TEXTURE_2D:
9960 {
9961 gl::Texture2D *texture2d = context->getTexture2D();
9962 texture2d->storage(levels, internalformat, width, height);
9963 }
9964 break;
9965
Geoff Lang01c21d22013-09-24 11:52:16 -04009966 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009967 {
9968 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9969 textureCube->storage(levels, internalformat, width);
9970 }
9971 break;
9972
9973 default:
9974 return gl::error(GL_INVALID_ENUM);
9975 }
9976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009977 }
9978 catch(std::bad_alloc&)
9979 {
9980 return gl::error(GL_OUT_OF_MEMORY);
9981 }
9982}
9983
9984void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9985{
9986 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9987 "GLsizei height = %d, GLsizei depth = %d)",
9988 target, levels, internalformat, width, height, depth);
9989
9990 try
9991 {
9992 gl::Context *context = gl::getNonLostContext();
9993
9994 if (context)
9995 {
9996 if (context->getClientVersion() < 3)
9997 {
9998 return gl::error(GL_INVALID_OPERATION);
9999 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010000
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010001 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010002 {
10003 return;
10004 }
10005
10006 switch (target)
10007 {
10008 case GL_TEXTURE_3D:
10009 {
10010 gl::Texture3D *texture3d = context->getTexture3D();
10011 texture3d->storage(levels, internalformat, width, height, depth);
10012 }
10013 break;
10014
10015 case GL_TEXTURE_2D_ARRAY:
10016 {
10017 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10018 texture2darray->storage(levels, internalformat, width, height, depth);
10019 }
10020 break;
10021
10022 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010023 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010024 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010025 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010026 }
10027 catch(std::bad_alloc&)
10028 {
10029 return gl::error(GL_OUT_OF_MEMORY);
10030 }
10031}
10032
10033void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10034{
10035 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10036 "GLint* params = 0x%0.8p)",
10037 target, internalformat, pname, bufSize, params);
10038
10039 try
10040 {
10041 gl::Context *context = gl::getNonLostContext();
10042
10043 if (context)
10044 {
10045 if (context->getClientVersion() < 3)
10046 {
10047 return gl::error(GL_INVALID_OPERATION);
10048 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010049
Shannon Woods809d2502013-07-08 10:32:18 -040010050 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10051 !gl::IsDepthRenderingSupported(internalformat, context) &&
10052 !gl::IsStencilRenderingSupported(internalformat, context))
10053 {
10054 return gl::error(GL_INVALID_ENUM);
10055 }
10056
10057 if (target != GL_RENDERBUFFER)
10058 {
10059 return gl::error(GL_INVALID_ENUM);
10060 }
10061
10062 if (bufSize < 0)
10063 {
10064 return gl::error(GL_INVALID_VALUE);
10065 }
10066
10067 switch (pname)
10068 {
10069 case GL_NUM_SAMPLE_COUNTS:
10070 if (bufSize != 0)
10071 *params = context->getNumSampleCounts(internalformat);
10072 break;
10073 case GL_SAMPLES:
10074 context->getSampleCounts(internalformat, bufSize, params);
10075 break;
10076 default:
10077 return gl::error(GL_INVALID_ENUM);
10078 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010080 }
10081 catch(std::bad_alloc&)
10082 {
10083 return gl::error(GL_OUT_OF_MEMORY);
10084 }
10085}
10086
10087// Extension functions
10088
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010089void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10090 GLbitfield mask, GLenum filter)
10091{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010092 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010093 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10094 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10095 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10096
10097 try
10098 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010099 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010100
10101 if (context)
10102 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010103 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010104 dstX0, dstY0, dstX1, dstY1, mask, filter,
10105 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010106 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010107 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010108 }
10109
Geoff Lang758d5b22013-06-11 11:42:50 -040010110 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10111 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010112 }
10113 }
10114 catch(std::bad_alloc&)
10115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010116 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010117 }
10118}
10119
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010120void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10121 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010122{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010123 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010124 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010125 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010126 target, level, internalformat, width, height, depth, border, format, type, pixels);
10127
10128 try
10129 {
10130 UNIMPLEMENTED(); // FIXME
10131 }
10132 catch(std::bad_alloc&)
10133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010134 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010135 }
10136}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010137
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010138void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10139 GLenum *binaryFormat, void *binary)
10140{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010141 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 +000010142 program, bufSize, length, binaryFormat, binary);
10143
10144 try
10145 {
10146 gl::Context *context = gl::getNonLostContext();
10147
10148 if (context)
10149 {
10150 gl::Program *programObject = context->getProgram(program);
10151
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010152 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010154 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010155 }
10156
10157 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10158
10159 if (!programBinary)
10160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010161 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010162 }
10163
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010164 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010166 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010167 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010168
10169 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010170 }
10171 }
10172 catch(std::bad_alloc&)
10173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010174 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010175 }
10176}
10177
10178void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10179 const void *binary, GLint length)
10180{
10181 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10182 program, binaryFormat, binary, length);
10183
10184 try
10185 {
10186 gl::Context *context = gl::getNonLostContext();
10187
10188 if (context)
10189 {
10190 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010192 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010193 }
10194
10195 gl::Program *programObject = context->getProgram(program);
10196
10197 if (!programObject)
10198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010199 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010200 }
10201
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010202 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010203 }
10204 }
10205 catch(std::bad_alloc&)
10206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010207 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010208 }
10209}
10210
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010211void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10212{
10213 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10214
10215 try
10216 {
10217 gl::Context *context = gl::getNonLostContext();
10218
10219 if (context)
10220 {
10221 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10222 {
10223 return gl::error(GL_INVALID_VALUE);
10224 }
10225
10226 if (context->getDrawFramebufferHandle() == 0)
10227 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010228 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010229 {
10230 return gl::error(GL_INVALID_OPERATION);
10231 }
10232
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010233 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010234 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010235 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010236 }
10237 }
10238 else
10239 {
10240 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10241 {
10242 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10243 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10244 {
10245 return gl::error(GL_INVALID_OPERATION);
10246 }
10247 }
10248 }
10249
10250 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10251
10252 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10253 {
10254 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10255 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010256
10257 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10258 {
10259 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10260 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010261 }
10262 }
10263 catch (std::bad_alloc&)
10264 {
10265 return gl::error(GL_OUT_OF_MEMORY);
10266 }
10267}
10268
Shannon Woodsb3801742014-03-27 14:59:19 -040010269void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
10270{
10271 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
10272
10273 try
10274 {
10275 gl::Context *context = gl::getNonLostContext();
10276
10277 if (context)
10278 {
10279 if (!context->supportsPBOs())
10280 {
10281 return gl::error(GL_INVALID_OPERATION);
10282 }
10283
10284 if (!gl::ValidBufferTarget(context, target))
10285 {
10286 return gl::error(GL_INVALID_ENUM);
10287 }
10288
10289 if (pname != GL_BUFFER_MAP_POINTER)
10290 {
10291 return gl::error(GL_INVALID_ENUM);
10292 }
10293
10294 gl::Buffer *buffer = context->getTargetBuffer(target);
10295
10296 if (!buffer || !buffer->mapped())
10297 {
10298 *params = NULL;
10299 }
10300
10301 *params = buffer->mapPointer();
10302 }
10303 }
10304 catch (std::bad_alloc&)
10305 {
10306 return gl::error(GL_OUT_OF_MEMORY);
10307 }
10308}
10309
10310void * __stdcall glMapBufferOES(GLenum target, GLenum access)
10311{
10312 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
10313
10314 try
10315 {
10316 gl::Context *context = gl::getNonLostContext();
10317
10318 if (context)
10319 {
10320 if (!gl::ValidBufferTarget(context, target))
10321 {
10322 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10323 }
10324
10325 gl::Buffer *buffer = context->getTargetBuffer(target);
10326
10327 if (buffer == NULL)
10328 {
10329 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10330 }
10331
10332 if (access != GL_WRITE_ONLY_OES)
10333 {
10334 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10335 }
10336
10337 if (buffer->mapped())
10338 {
10339 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10340 }
10341
10342 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10343 }
10344 }
10345 catch(std::bad_alloc&)
10346 {
10347 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10348 }
10349
10350 return NULL;
10351}
10352
10353GLboolean __stdcall glUnmapBufferOES(GLenum target)
10354{
10355 EVENT("(GLenum target = 0x%X)", target);
10356
10357 try
10358 {
10359 gl::Context *context = gl::getNonLostContext();
10360
10361 if (context)
10362 {
10363 if (!gl::ValidBufferTarget(context, target))
10364 {
10365 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10366 }
10367
10368 gl::Buffer *buffer = context->getTargetBuffer(target);
10369
10370 if (buffer == NULL || !buffer->mapped())
10371 {
10372 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10373 }
10374
10375 // TODO: detect if we had corruption. if so, throw an error and return false.
10376
10377 buffer->unmap();
10378
10379 return GL_TRUE;
10380 }
10381 }
10382 catch(std::bad_alloc&)
10383 {
10384 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10385 }
10386
10387 return GL_FALSE;
10388}
10389
Shannon Woods916e7692014-03-27 16:58:22 -040010390void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10391{
10392 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10393 target, offset, length, access);
10394
10395 try
10396 {
10397 gl::Context *context = gl::getNonLostContext();
10398
10399 if (context)
10400 {
10401 if (!gl::ValidBufferTarget(context, target))
10402 {
10403 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10404 }
10405
10406 if (offset < 0 || length < 0)
10407 {
10408 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10409 }
10410
10411 gl::Buffer *buffer = context->getTargetBuffer(target);
10412
10413 if (buffer == NULL)
10414 {
10415 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10416 }
10417
10418 // Check for buffer overflow
10419 size_t offsetSize = static_cast<size_t>(offset);
10420 size_t lengthSize = static_cast<size_t>(length);
10421
10422 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10423 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10424 {
10425 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10426 }
10427
10428 // Check for invalid bits in the mask
10429 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10430 GL_MAP_WRITE_BIT |
10431 GL_MAP_INVALIDATE_RANGE_BIT |
10432 GL_MAP_INVALIDATE_BUFFER_BIT |
10433 GL_MAP_FLUSH_EXPLICIT_BIT |
10434 GL_MAP_UNSYNCHRONIZED_BIT;
10435
10436 if (access & ~(allAccessBits))
10437 {
10438 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10439 }
10440
10441 if (length == 0 || buffer->mapped())
10442 {
10443 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10444 }
10445
10446 // Check for invalid bit combinations
10447 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10448 {
10449 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10450 }
10451
10452 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10453 GL_MAP_INVALIDATE_BUFFER_BIT |
10454 GL_MAP_UNSYNCHRONIZED_BIT;
10455
10456 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10457 {
10458 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10459 }
10460
10461 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10462 {
10463 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10464 }
10465
10466 return buffer->mapRange(offset, length, access);
10467 }
10468 }
10469 catch(std::bad_alloc&)
10470 {
10471 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10472 }
10473
10474 return NULL;
10475}
10476
10477void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10478{
10479 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10480
10481 try
10482 {
10483 gl::Context *context = gl::getNonLostContext();
10484
10485 if (context)
10486 {
10487 if (offset < 0 || length < 0)
10488 {
10489 return gl::error(GL_INVALID_VALUE);
10490 }
10491
10492 if (!gl::ValidBufferTarget(context, target))
10493 {
10494 return gl::error(GL_INVALID_ENUM);
10495 }
10496
10497 gl::Buffer *buffer = context->getTargetBuffer(target);
10498
10499 if (buffer == NULL)
10500 {
10501 return gl::error(GL_INVALID_OPERATION);
10502 }
10503
10504 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10505 {
10506 return gl::error(GL_INVALID_OPERATION);
10507 }
10508
10509 // Check for buffer overflow
10510 size_t offsetSize = static_cast<size_t>(offset);
10511 size_t lengthSize = static_cast<size_t>(length);
10512
10513 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10514 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10515 {
10516 return gl::error(GL_INVALID_VALUE);
10517 }
10518
10519 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10520 }
10521 }
10522 catch(std::bad_alloc&)
10523 {
10524 return gl::error(GL_OUT_OF_MEMORY);
10525 }
10526}
10527
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010528__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10529{
10530 struct Extension
10531 {
10532 const char *name;
10533 __eglMustCastToProperFunctionPointerType address;
10534 };
10535
10536 static const Extension glExtensions[] =
10537 {
10538 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010539 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010540 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010541 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10542 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10543 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10544 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10545 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10546 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10547 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010548 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010549 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010550 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10551 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10552 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10553 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010554 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10555 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10556 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10557 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10558 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10559 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10560 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010561 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010562 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10563 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10564 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010565 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010566 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10567 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10568 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010569 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10570 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10571 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010572
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010573 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010574 {
10575 if (strcmp(procname, glExtensions[ext].name) == 0)
10576 {
10577 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10578 }
10579 }
10580
10581 return NULL;
10582}
10583
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010584// Non-public functions used by EGL
10585
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010586bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010587{
10588 EVENT("(egl::Surface* surface = 0x%0.8p)",
10589 surface);
10590
10591 try
10592 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010593 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010594
10595 if (context)
10596 {
10597 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010598 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010599
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010600 if (textureObject->isImmutable())
10601 {
10602 return false;
10603 }
10604
Geoff Lang32d508e2014-02-11 09:39:48 -050010605 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010606 }
10607 }
10608 catch(std::bad_alloc&)
10609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010610 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010611 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010612
10613 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010614}
10615
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010616}