blob: 2ddafec5a4be80a2621eea2988b0e0bc4f0f4009 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
55 catch(std::bad_alloc&)
56 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
104 catch(std::bad_alloc&)
105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Geoff Lang37dde692014-01-31 16:34:54 -0500120 if (!ValidQueryType(context, target))
121 {
122 return gl::error(GL_INVALID_ENUM);
123 }
124
125 if (id == 0)
126 {
127 return gl::error(GL_INVALID_OPERATION);
128 }
129
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000130 context->beginQuery(target, id);
131 }
132 }
133 catch(std::bad_alloc&)
134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000136 }
137}
138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000139void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142
143 try
144 {
145 if (index >= gl::MAX_VERTEX_ATTRIBS)
146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 }
149
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 if (context)
153 {
154 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156 if (!programObject)
157 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 if (context->getShader(program))
159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000160 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000161 }
162 else
163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000165 }
166 }
167
168 if (strncmp(name, "gl_", 3) == 0)
169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171 }
172
173 programObject->bindAttributeLocation(index, name);
174 }
175 }
176 catch(std::bad_alloc&)
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179 }
180}
181
182void __stdcall glBindBuffer(GLenum target, GLuint buffer)
183{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000184 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
186 try
187 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189
190 if (context)
191 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500192 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000193 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500194 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000195 }
196
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000197 switch (target)
198 {
199 case GL_ARRAY_BUFFER:
200 context->bindArrayBuffer(buffer);
201 return;
202 case GL_ELEMENT_ARRAY_BUFFER:
203 context->bindElementArrayBuffer(buffer);
204 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000205 case GL_COPY_READ_BUFFER:
206 context->bindCopyReadBuffer(buffer);
207 return;
208 case GL_COPY_WRITE_BUFFER:
209 context->bindCopyWriteBuffer(buffer);
210 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000211 case GL_PIXEL_PACK_BUFFER:
212 context->bindPixelPackBuffer(buffer);
213 return;
214 case GL_PIXEL_UNPACK_BUFFER:
215 context->bindPixelUnpackBuffer(buffer);
216 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 case GL_UNIFORM_BUFFER:
218 context->bindGenericUniformBuffer(buffer);
219 return;
220 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000221 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000222 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000224 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225 }
226 }
227 }
228 catch(std::bad_alloc&)
229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231 }
232}
233
234void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000236 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237
238 try
239 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500240 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243 }
244
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246
247 if (context)
248 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000249 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindReadFramebuffer(framebuffer);
252 }
253
254 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
255 {
256 context->bindDrawFramebuffer(framebuffer);
257 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259 }
260 catch(std::bad_alloc&)
261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263 }
264}
265
266void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000268 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000269
270 try
271 {
272 if (target != GL_RENDERBUFFER)
273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 }
276
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278
279 if (context)
280 {
281 context->bindRenderbuffer(renderbuffer);
282 }
283 }
284 catch(std::bad_alloc&)
285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000286 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287 }
288}
289
290void __stdcall glBindTexture(GLenum target, GLuint texture)
291{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000292 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
294 try
295 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297
298 if (context)
299 {
300 gl::Texture *textureObject = context->getTexture(texture);
301
302 if (textureObject && textureObject->getTarget() != target && texture != 0)
303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000304 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305 }
306
307 switch (target)
308 {
309 case GL_TEXTURE_2D:
310 context->bindTexture2D(texture);
311 return;
312 case GL_TEXTURE_CUBE_MAP:
313 context->bindTextureCubeMap(texture);
314 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000315 case GL_TEXTURE_3D:
316 if (context->getClientVersion() < 3)
317 {
318 return gl::error(GL_INVALID_ENUM);
319 }
320 context->bindTexture3D(texture);
321 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000322 case GL_TEXTURE_2D_ARRAY:
323 if (context->getClientVersion() < 3)
324 {
325 return gl::error(GL_INVALID_ENUM);
326 }
327 context->bindTexture2DArray(texture);
328 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000329 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 }
332 }
333 }
334 catch(std::bad_alloc&)
335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337 }
338}
339
340void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000342 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000343 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344
345 try
346 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000347 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348
349 if (context)
350 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000351 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353 }
354 catch(std::bad_alloc&)
355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357 }
358}
359
360void __stdcall glBlendEquation(GLenum mode)
361{
362 glBlendEquationSeparate(mode, mode);
363}
364
365void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000367 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368
369 try
370 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000371 gl::Context *context = gl::getNonLostContext();
372
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373 switch (modeRGB)
374 {
375 case GL_FUNC_ADD:
376 case GL_FUNC_SUBTRACT:
377 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000378 case GL_MIN:
379 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000380 break;
381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384 }
385
386 switch (modeAlpha)
387 {
388 case GL_FUNC_ADD:
389 case GL_FUNC_SUBTRACT:
390 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000391 case GL_MIN:
392 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000393 break;
394
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000396 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 if (context)
400 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000401 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403 }
404 catch(std::bad_alloc&)
405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000407 }
408}
409
410void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
411{
412 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
413}
414
415void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000417 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000418 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419
420 try
421 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000422 gl::Context *context = gl::getNonLostContext();
423
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424 switch (srcRGB)
425 {
426 case GL_ZERO:
427 case GL_ONE:
428 case GL_SRC_COLOR:
429 case GL_ONE_MINUS_SRC_COLOR:
430 case GL_DST_COLOR:
431 case GL_ONE_MINUS_DST_COLOR:
432 case GL_SRC_ALPHA:
433 case GL_ONE_MINUS_SRC_ALPHA:
434 case GL_DST_ALPHA:
435 case GL_ONE_MINUS_DST_ALPHA:
436 case GL_CONSTANT_COLOR:
437 case GL_ONE_MINUS_CONSTANT_COLOR:
438 case GL_CONSTANT_ALPHA:
439 case GL_ONE_MINUS_CONSTANT_ALPHA:
440 case GL_SRC_ALPHA_SATURATE:
441 break;
442 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444 }
445
446 switch (dstRGB)
447 {
448 case GL_ZERO:
449 case GL_ONE:
450 case GL_SRC_COLOR:
451 case GL_ONE_MINUS_SRC_COLOR:
452 case GL_DST_COLOR:
453 case GL_ONE_MINUS_DST_COLOR:
454 case GL_SRC_ALPHA:
455 case GL_ONE_MINUS_SRC_ALPHA:
456 case GL_DST_ALPHA:
457 case GL_ONE_MINUS_DST_ALPHA:
458 case GL_CONSTANT_COLOR:
459 case GL_ONE_MINUS_CONSTANT_COLOR:
460 case GL_CONSTANT_ALPHA:
461 case GL_ONE_MINUS_CONSTANT_ALPHA:
462 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000463
464 case GL_SRC_ALPHA_SATURATE:
465 if (!context || context->getClientVersion() < 3)
466 {
467 return gl::error(GL_INVALID_ENUM);
468 }
469 break;
470
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000471 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473 }
474
475 switch (srcAlpha)
476 {
477 case GL_ZERO:
478 case GL_ONE:
479 case GL_SRC_COLOR:
480 case GL_ONE_MINUS_SRC_COLOR:
481 case GL_DST_COLOR:
482 case GL_ONE_MINUS_DST_COLOR:
483 case GL_SRC_ALPHA:
484 case GL_ONE_MINUS_SRC_ALPHA:
485 case GL_DST_ALPHA:
486 case GL_ONE_MINUS_DST_ALPHA:
487 case GL_CONSTANT_COLOR:
488 case GL_ONE_MINUS_CONSTANT_COLOR:
489 case GL_CONSTANT_ALPHA:
490 case GL_ONE_MINUS_CONSTANT_ALPHA:
491 case GL_SRC_ALPHA_SATURATE:
492 break;
493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000494 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000495 }
496
497 switch (dstAlpha)
498 {
499 case GL_ZERO:
500 case GL_ONE:
501 case GL_SRC_COLOR:
502 case GL_ONE_MINUS_SRC_COLOR:
503 case GL_DST_COLOR:
504 case GL_ONE_MINUS_DST_COLOR:
505 case GL_SRC_ALPHA:
506 case GL_ONE_MINUS_SRC_ALPHA:
507 case GL_DST_ALPHA:
508 case GL_ONE_MINUS_DST_ALPHA:
509 case GL_CONSTANT_COLOR:
510 case GL_ONE_MINUS_CONSTANT_COLOR:
511 case GL_CONSTANT_ALPHA:
512 case GL_ONE_MINUS_CONSTANT_ALPHA:
513 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000514
515 case GL_SRC_ALPHA_SATURATE:
516 if (!context || context->getClientVersion() < 3)
517 {
518 return gl::error(GL_INVALID_ENUM);
519 }
520 break;
521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000524 }
525
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000526 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
527 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
528
529 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
530 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
531
532 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000534 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000535 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 if (context)
539 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000540 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542 }
543 catch(std::bad_alloc&)
544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546 }
547}
548
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000549void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000551 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000552 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000553
554 try
555 {
556 if (size < 0)
557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559 }
560
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000561 gl::Context *context = gl::getNonLostContext();
562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000563 switch (usage)
564 {
565 case GL_STREAM_DRAW:
566 case GL_STATIC_DRAW:
567 case GL_DYNAMIC_DRAW:
568 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000569
570 case GL_STREAM_READ:
571 case GL_STREAM_COPY:
572 case GL_STATIC_READ:
573 case GL_STATIC_COPY:
574 case GL_DYNAMIC_READ:
575 case GL_DYNAMIC_COPY:
576 if (context && context->getClientVersion() < 3)
577 {
578 return gl::error(GL_INVALID_ENUM);
579 }
580 break;
581
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 }
585
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 if (context)
587 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000590 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000591 }
592
Jamie Madill8c96d582014-03-05 15:01:23 -0500593 gl::Buffer *buffer = context->getTargetBuffer(target);
594
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 if (!buffer)
596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000597 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000600 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602 }
603 catch(std::bad_alloc&)
604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000605 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606 }
607}
608
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000609void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000611 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000612 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613
614 try
615 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000616 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619 }
620
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000621 if (data == NULL)
622 {
623 return;
624 }
625
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000626 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000627
628 if (context)
629 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000632 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000633 }
634
Jamie Madill8c96d582014-03-05 15:01:23 -0500635 gl::Buffer *buffer = context->getTargetBuffer(target);
636
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 if (!buffer)
638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000640 }
641
Jamie Madill7a5f7382014-03-05 15:01:24 -0500642 if (buffer->mapped())
643 {
644 return gl::error(GL_INVALID_OPERATION);
645 }
646
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000647 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000650 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000651
652 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 }
655 catch(std::bad_alloc&)
656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 }
659}
660
661GLenum __stdcall glCheckFramebufferStatus(GLenum target)
662{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000663 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664
665 try
666 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500667 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000669 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000670 }
671
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000672 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673
674 if (context)
675 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500676 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
677 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 return framebuffer->completeness();
679 }
680 }
681 catch(std::bad_alloc&)
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684 }
685
686 return 0;
687}
688
689void __stdcall glClear(GLbitfield mask)
690{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000691 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692
693 try
694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696
697 if (context)
698 {
Geoff Lang0b833232013-08-21 10:13:29 -0400699 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
700
701 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
702 {
703 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
704 }
705
706 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
707 {
708 return gl::error(GL_INVALID_VALUE);
709 }
710
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000711 context->clear(mask);
712 }
713 }
714 catch(std::bad_alloc&)
715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 }
718}
719
720void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000722 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000723 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 try
726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728
729 if (context)
730 {
731 context->setClearColor(red, green, blue, alpha);
732 }
733 }
734 catch(std::bad_alloc&)
735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737 }
738}
739
740void __stdcall glClearDepthf(GLclampf depth)
741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000742 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743
744 try
745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000747
748 if (context)
749 {
750 context->setClearDepth(depth);
751 }
752 }
753 catch(std::bad_alloc&)
754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000756 }
757}
758
759void __stdcall glClearStencil(GLint s)
760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000761 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762
763 try
764 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000766
767 if (context)
768 {
769 context->setClearStencil(s);
770 }
771 }
772 catch(std::bad_alloc&)
773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776}
777
778void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
779{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000780 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000781 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 try
784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786
787 if (context)
788 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000789 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000790 }
791 }
792 catch(std::bad_alloc&)
793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000795 }
796}
797
798void __stdcall glCompileShader(GLuint shader)
799{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000800 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 try
803 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000805
806 if (context)
807 {
808 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000809
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810 if (!shaderObject)
811 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000812 if (context->getProgram(shader))
813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000814 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000815 }
816 else
817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000819 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820 }
821
822 shaderObject->compile();
823 }
824 }
825 catch(std::bad_alloc&)
826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 }
829}
830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000831void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
832 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000834 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000835 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 target, level, internalformat, width, height, border, imageSize, data);
837
838 try
839 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000841
842 if (context)
843 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000844 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400845 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000846 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
847 {
848 return;
849 }
850
851 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400852 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400853 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000854 {
855 return;
856 }
857
858 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000861 }
862
863 switch (target)
864 {
865 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000866 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000867 gl::Texture2D *texture = context->getTexture2D();
868 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000869 }
870 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000871
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
873 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
874 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
875 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
877 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000878 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000879 gl::TextureCubeMap *texture = context->getTextureCubeMap();
880 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000881 }
882 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000883
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000885 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000886 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000887 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000888 }
889 catch(std::bad_alloc&)
890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892 }
893}
894
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000895void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
896 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000898 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000899 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000900 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 target, level, xoffset, yoffset, width, height, format, imageSize, data);
902
903 try
904 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000905 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000906
907 if (context)
908 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000909 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400910 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000911 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
912 {
913 return;
914 }
915
916 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400917 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400918 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000919 {
920 return;
921 }
922
923 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000926 }
927
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000928 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000929 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000930 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000931 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000932 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000933 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000934 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000935 break;
936
937 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
938 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
939 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
940 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
942 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000943 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000945 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000946 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000947 break;
948
949 default:
950 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000951 }
952 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953 }
954 catch(std::bad_alloc&)
955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
958}
959
960void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000962 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000963 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 target, level, internalformat, x, y, width, height, border);
965
966 try
967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000969
970 if (context)
971 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000972 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400973 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000974 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000975 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000976 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000977 }
978
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400980 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000981 0, 0, 0, x, y, width, height, border))
982 {
983 return;
984 }
985
986 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
987
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000988 switch (target)
989 {
990 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000992 gl::Texture2D *texture = context->getTexture2D();
993 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 }
995 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
998 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001003 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001004 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1005 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 }
1007 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001008
1009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001011 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001013 }
1014 catch(std::bad_alloc&)
1015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018}
1019
1020void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001024 target, level, xoffset, yoffset, x, y, width, height);
1025
1026 try
1027 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001029
1030 if (context)
1031 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001032 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001033 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001034 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001035 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001036 return;
1037 }
1038
1039 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001040 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001041 xoffset, yoffset, 0, x, y, width, height, 0))
1042 {
1043 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001044 }
1045
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001046 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001047
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001048 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001049 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001050 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001051 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001052 gl::Texture2D *texture = context->getTexture2D();
1053 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001054 }
1055 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001056
1057 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1058 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1060 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1062 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001063 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001064 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1065 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001066 }
1067 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001069 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001071 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001073 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001074
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001075 catch(std::bad_alloc&)
1076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001078 }
1079}
1080
1081GLuint __stdcall glCreateProgram(void)
1082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001083 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084
1085 try
1086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001088
1089 if (context)
1090 {
1091 return context->createProgram();
1092 }
1093 }
1094 catch(std::bad_alloc&)
1095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001096 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001097 }
1098
1099 return 0;
1100}
1101
1102GLuint __stdcall glCreateShader(GLenum type)
1103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001104 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001105
1106 try
1107 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109
1110 if (context)
1111 {
1112 switch (type)
1113 {
1114 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001115 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001116 return context->createShader(type);
1117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 }
1120 }
1121 }
1122 catch(std::bad_alloc&)
1123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126
1127 return 0;
1128}
1129
1130void __stdcall glCullFace(GLenum mode)
1131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001132 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001133
1134 try
1135 {
1136 switch (mode)
1137 {
1138 case GL_FRONT:
1139 case GL_BACK:
1140 case GL_FRONT_AND_BACK:
1141 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001143
1144 if (context)
1145 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001146 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001147 }
1148 }
1149 break;
1150 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001151 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001152 }
1153 }
1154 catch(std::bad_alloc&)
1155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001157 }
1158}
1159
1160void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1161{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001162 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163
1164 try
1165 {
1166 if (n < 0)
1167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169 }
1170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172
1173 if (context)
1174 {
1175 for (int i = 0; i < n; i++)
1176 {
1177 context->deleteBuffer(buffers[i]);
1178 }
1179 }
1180 }
1181 catch(std::bad_alloc&)
1182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001183 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184 }
1185}
1186
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001187void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1188{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001189 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001190
1191 try
1192 {
1193 if (n < 0)
1194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001195 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001196 }
1197
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001198 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001199
1200 if (context)
1201 {
1202 for (int i = 0; i < n; i++)
1203 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001204 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001205 }
1206 }
1207 }
1208 catch(std::bad_alloc&)
1209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001211 }
1212}
1213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001216 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217
1218 try
1219 {
1220 if (n < 0)
1221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001223 }
1224
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226
1227 if (context)
1228 {
1229 for (int i = 0; i < n; i++)
1230 {
1231 if (framebuffers[i] != 0)
1232 {
1233 context->deleteFramebuffer(framebuffers[i]);
1234 }
1235 }
1236 }
1237 }
1238 catch(std::bad_alloc&)
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 }
1242}
1243
1244void __stdcall glDeleteProgram(GLuint program)
1245{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001246 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247
1248 try
1249 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001250 if (program == 0)
1251 {
1252 return;
1253 }
1254
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001255 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256
1257 if (context)
1258 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001259 if (!context->getProgram(program))
1260 {
1261 if(context->getShader(program))
1262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001263 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001264 }
1265 else
1266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001268 }
1269 }
1270
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 context->deleteProgram(program);
1272 }
1273 }
1274 catch(std::bad_alloc&)
1275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277 }
1278}
1279
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001280void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1281{
1282 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1283
1284 try
1285 {
1286 if (n < 0)
1287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001289 }
1290
1291 gl::Context *context = gl::getNonLostContext();
1292
1293 if (context)
1294 {
1295 for (int i = 0; i < n; i++)
1296 {
1297 context->deleteQuery(ids[i]);
1298 }
1299 }
1300 }
1301 catch(std::bad_alloc&)
1302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001304 }
1305}
1306
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1308{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001309 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310
1311 try
1312 {
1313 if (n < 0)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001316 }
1317
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001318 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319
1320 if (context)
1321 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001322 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 {
1324 context->deleteRenderbuffer(renderbuffers[i]);
1325 }
1326 }
1327 }
1328 catch(std::bad_alloc&)
1329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331 }
1332}
1333
1334void __stdcall glDeleteShader(GLuint shader)
1335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001336 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337
1338 try
1339 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001340 if (shader == 0)
1341 {
1342 return;
1343 }
1344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346
1347 if (context)
1348 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001349 if (!context->getShader(shader))
1350 {
1351 if(context->getProgram(shader))
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001354 }
1355 else
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001358 }
1359 }
1360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001361 context->deleteShader(shader);
1362 }
1363 }
1364 catch(std::bad_alloc&)
1365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 }
1368}
1369
1370void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001372 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 try
1375 {
1376 if (n < 0)
1377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001379 }
1380
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382
1383 if (context)
1384 {
1385 for (int i = 0; i < n; i++)
1386 {
1387 if (textures[i] != 0)
1388 {
1389 context->deleteTexture(textures[i]);
1390 }
1391 }
1392 }
1393 }
1394 catch(std::bad_alloc&)
1395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001397 }
1398}
1399
1400void __stdcall glDepthFunc(GLenum func)
1401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001402 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001403
1404 try
1405 {
1406 switch (func)
1407 {
1408 case GL_NEVER:
1409 case GL_ALWAYS:
1410 case GL_LESS:
1411 case GL_LEQUAL:
1412 case GL_EQUAL:
1413 case GL_GREATER:
1414 case GL_GEQUAL:
1415 case GL_NOTEQUAL:
1416 break;
1417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419 }
1420
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422
1423 if (context)
1424 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001425 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001426 }
1427 }
1428 catch(std::bad_alloc&)
1429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431 }
1432}
1433
1434void __stdcall glDepthMask(GLboolean flag)
1435{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001436 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437
1438 try
1439 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441
1442 if (context)
1443 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001444 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446 }
1447 catch(std::bad_alloc&)
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450 }
1451}
1452
1453void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001455 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001463 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465 }
1466 catch(std::bad_alloc&)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 }
1470}
1471
1472void __stdcall glDetachShader(GLuint program, GLuint shader)
1473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001474 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 try
1477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479
1480 if (context)
1481 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001482
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483 gl::Program *programObject = context->getProgram(program);
1484 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001485
1486 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001487 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488 gl::Shader *shaderByProgramHandle;
1489 shaderByProgramHandle = context->getShader(program);
1490 if (!shaderByProgramHandle)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001493 }
1494 else
1495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001497 }
1498 }
1499
1500 if (!shaderObject)
1501 {
1502 gl::Program *programByShaderHandle = context->getProgram(shader);
1503 if (!programByShaderHandle)
1504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001506 }
1507 else
1508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001510 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001511 }
1512
1513 if (!programObject->detachShader(shaderObject))
1514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
1518 }
1519 catch(std::bad_alloc&)
1520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
1523}
1524
1525void __stdcall glDisable(GLenum cap)
1526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001527 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528
1529 try
1530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001532
1533 if (context)
1534 {
Geoff Lang0550d032014-01-30 11:29:07 -05001535 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538 }
Geoff Lang0550d032014-01-30 11:29:07 -05001539
1540 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
1542 }
1543 catch(std::bad_alloc&)
1544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001546 }
1547}
1548
1549void __stdcall glDisableVertexAttribArray(GLuint index)
1550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001551 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552
1553 try
1554 {
1555 if (index >= gl::MAX_VERTEX_ATTRIBS)
1556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558 }
1559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561
1562 if (context)
1563 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001564 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565 }
1566 }
1567 catch(std::bad_alloc&)
1568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571}
1572
1573void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001575 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576
1577 try
1578 {
1579 if (count < 0 || first < 0)
1580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582 }
1583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585
Jamie Madill7a5f7382014-03-05 15:01:24 -05001586 // Check for mapped buffers
1587 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1588 {
1589 return gl::error(GL_INVALID_OPERATION);
1590 }
1591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592 if (context)
1593 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001594 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1595 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1596 curTransformFeedback->getDrawMode() != mode)
1597 {
1598 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1599 // that does not match the current transform feedback object's draw mode (if transform feedback
1600 // is active), (3.0.2, section 2.14, pg 86)
1601 return gl::error(GL_INVALID_OPERATION);
1602 }
1603
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001604 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605 }
1606 }
1607 catch(std::bad_alloc&)
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001610 }
1611}
1612
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001613void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1614{
1615 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1616
1617 try
1618 {
1619 if (count < 0 || first < 0 || primcount < 0)
1620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001622 }
1623
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001624 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001625 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001626 gl::Context *context = gl::getNonLostContext();
1627
Jamie Madill7a5f7382014-03-05 15:01:24 -05001628 // Check for mapped buffers
1629 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1630 {
1631 return gl::error(GL_INVALID_OPERATION);
1632 }
1633
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001634 if (context)
1635 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001636 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1637 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1638 curTransformFeedback->getDrawMode() != mode)
1639 {
1640 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1641 // that does not match the current transform feedback object's draw mode (if transform feedback
1642 // is active), (3.0.2, section 2.14, pg 86)
1643 return gl::error(GL_INVALID_OPERATION);
1644 }
1645
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001646 context->drawArrays(mode, first, count, primcount);
1647 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001648 }
1649 }
1650 catch(std::bad_alloc&)
1651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001653 }
1654}
1655
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001656void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001658 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001659 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660
1661 try
1662 {
1663 if (count < 0)
1664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666 }
1667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 if (context)
1671 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001672 switch (type)
1673 {
1674 case GL_UNSIGNED_BYTE:
1675 case GL_UNSIGNED_SHORT:
1676 break;
1677 case GL_UNSIGNED_INT:
1678 if (!context->supports32bitIndices())
1679 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001680 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001681 }
1682 break;
1683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001685 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001686
1687 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1688 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1689 {
1690 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1691 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1692 return gl::error(GL_INVALID_OPERATION);
1693 }
1694
Jamie Madill7a5f7382014-03-05 15:01:24 -05001695 // Check for mapped buffers
1696 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1697 {
1698 return gl::error(GL_INVALID_OPERATION);
1699 }
1700
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001701 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001702 }
1703 }
1704 catch(std::bad_alloc&)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708}
1709
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001710void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1711{
1712 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1713 mode, count, type, indices, primcount);
1714
1715 try
1716 {
1717 if (count < 0 || primcount < 0)
1718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001720 }
1721
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001722 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001723 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001724 gl::Context *context = gl::getNonLostContext();
1725
1726 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001727 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001728 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001729 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001730 case GL_UNSIGNED_BYTE:
1731 case GL_UNSIGNED_SHORT:
1732 break;
1733 case GL_UNSIGNED_INT:
1734 if (!context->supports32bitIndices())
1735 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001737 }
1738 break;
1739 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001741 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001742
1743 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1744 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1745 {
1746 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1747 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1748 return gl::error(GL_INVALID_OPERATION);
1749 }
1750
Jamie Madill7a5f7382014-03-05 15:01:24 -05001751 // Check for mapped buffers
1752 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1753 {
1754 return gl::error(GL_INVALID_OPERATION);
1755 }
1756
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001757 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001758 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
1760 }
1761 catch(std::bad_alloc&)
1762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001764 }
1765}
1766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767void __stdcall glEnable(GLenum cap)
1768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001769 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770
1771 try
1772 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001773 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774
1775 if (context)
1776 {
Geoff Lang0550d032014-01-30 11:29:07 -05001777 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780 }
Geoff Lang0550d032014-01-30 11:29:07 -05001781
1782 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783 }
1784 }
1785 catch(std::bad_alloc&)
1786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789}
1790
1791void __stdcall glEnableVertexAttribArray(GLuint index)
1792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001793 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794
1795 try
1796 {
1797 if (index >= gl::MAX_VERTEX_ATTRIBS)
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800 }
1801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 if (context)
1805 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001806 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 }
1808 }
1809 catch(std::bad_alloc&)
1810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813}
1814
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001815void __stdcall glEndQueryEXT(GLenum target)
1816{
1817 EVENT("GLenum target = 0x%X)", target);
1818
1819 try
1820 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001821 gl::Context *context = gl::getNonLostContext();
1822
1823 if (context)
1824 {
Geoff Lang37dde692014-01-31 16:34:54 -05001825 if (!ValidQueryType(context, target))
1826 {
1827 return gl::error(GL_INVALID_ENUM);
1828 }
1829
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001830 context->endQuery(target);
1831 }
1832 }
1833 catch(std::bad_alloc&)
1834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001836 }
1837}
1838
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001839void __stdcall glFinishFenceNV(GLuint fence)
1840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001841 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001842
1843 try
1844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001845 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001846
1847 if (context)
1848 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001849 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001850
1851 if (fenceObject == NULL)
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001854 }
1855
Jamie Madillfb9a7402013-07-26 11:55:01 -04001856 if (fenceObject->isFence() != GL_TRUE)
1857 {
1858 return gl::error(GL_INVALID_OPERATION);
1859 }
1860
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001861 fenceObject->finishFence();
1862 }
1863 }
1864 catch(std::bad_alloc&)
1865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001867 }
1868}
1869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870void __stdcall glFinish(void)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877
1878 if (context)
1879 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001880 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001881 }
1882 }
1883 catch(std::bad_alloc&)
1884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001885 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001886 }
1887}
1888
1889void __stdcall glFlush(void)
1890{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001891 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892
1893 try
1894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
1897 if (context)
1898 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001899 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 }
1901 }
1902 catch(std::bad_alloc&)
1903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905 }
1906}
1907
1908void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001910 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001911 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912
1913 try
1914 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001915 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
1919
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 if (context)
1923 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001924 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001925 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001926 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001928
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001929 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1930 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001932 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001934 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001935 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001936 }
1937 else
1938 {
1939 switch (attachment)
1940 {
1941 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001942 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001943 break;
1944 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001945 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001946 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001947 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1949 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001950 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001951 UNREACHABLE();
1952 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955 }
1956 }
1957 catch(std::bad_alloc&)
1958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961}
1962
1963void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001965 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001966 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 try
1969 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 if (context)
1972 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001974 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001975 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001976 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001977 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001978
1979 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001980 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001981 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001982 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001983 }
1984
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001985 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001987 textarget = GL_NONE;
1988 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001990 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001991
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001992 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001993 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001994 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001995 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001996 }
1997 else
1998 {
1999 switch (attachment)
2000 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002001 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2002 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2003 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002004 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002006 }
2007 }
2008 catch(std::bad_alloc&)
2009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002010 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002011 }
2012}
2013
2014void __stdcall glFrontFace(GLenum mode)
2015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002016 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002017
2018 try
2019 {
2020 switch (mode)
2021 {
2022 case GL_CW:
2023 case GL_CCW:
2024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026
2027 if (context)
2028 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002029 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030 }
2031 }
2032 break;
2033 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002034 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035 }
2036 }
2037 catch(std::bad_alloc&)
2038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002040 }
2041}
2042
2043void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002045 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046
2047 try
2048 {
2049 if (n < 0)
2050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 }
2053
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002054 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055
2056 if (context)
2057 {
2058 for (int i = 0; i < n; i++)
2059 {
2060 buffers[i] = context->createBuffer();
2061 }
2062 }
2063 }
2064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070void __stdcall glGenerateMipmap(GLenum target)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073
2074 try
2075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002077
2078 if (context)
2079 {
Jamie Madill35d15012013-10-07 10:46:37 -04002080 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002082 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002083 }
Geoff Langae4852a2013-06-05 15:00:34 -04002084
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002085 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002086
2087 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002088 {
2089 return gl::error(GL_INVALID_OPERATION);
2090 }
2091
Geoff Lang005df412013-10-16 14:12:50 -04002092 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002093
Geoff Langae4852a2013-06-05 15:00:34 -04002094 // Internally, all texture formats are sized so checking if the format
2095 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002096
2097 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2098 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2099
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002100 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2101 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002102 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2103 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002104 {
2105 return gl::error(GL_INVALID_OPERATION);
2106 }
2107
Jamie Madillc1f8b162013-10-07 10:46:38 -04002108 // Non-power of 2 ES2 check
2109 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2110 {
2111 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2112 return gl::error(GL_INVALID_OPERATION);
2113 }
2114
2115 // Cube completeness check
2116 if (target == GL_TEXTURE_CUBE_MAP)
2117 {
2118 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2119 if (!textureCube->isCubeComplete())
2120 {
2121 return gl::error(GL_INVALID_OPERATION);
2122 }
2123 }
2124
Geoff Langae4852a2013-06-05 15:00:34 -04002125 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002126 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127 }
2128 catch(std::bad_alloc&)
2129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002131 }
2132}
2133
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002134void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002136 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002137
2138 try
2139 {
2140 if (n < 0)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002143 }
2144
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002145 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002146
2147 if (context)
2148 {
2149 for (int i = 0; i < n; i++)
2150 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002151 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002152 }
2153 }
2154 }
2155 catch(std::bad_alloc&)
2156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002158 }
2159}
2160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002163 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164
2165 try
2166 {
2167 if (n < 0)
2168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173
2174 if (context)
2175 {
2176 for (int i = 0; i < n; i++)
2177 {
2178 framebuffers[i] = context->createFramebuffer();
2179 }
2180 }
2181 }
2182 catch(std::bad_alloc&)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002188void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2189{
2190 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2191
2192 try
2193 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002194 gl::Context *context = gl::getNonLostContext();
2195
2196 if (context)
2197 {
Geoff Lang37dde692014-01-31 16:34:54 -05002198 if (n < 0)
2199 {
2200 return gl::error(GL_INVALID_VALUE);
2201 }
2202
2203 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002204 {
2205 ids[i] = context->createQuery();
2206 }
2207 }
2208 }
2209 catch(std::bad_alloc&)
2210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002212 }
2213}
2214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002217 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218
2219 try
2220 {
2221 if (n < 0)
2222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002224 }
2225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227
2228 if (context)
2229 {
2230 for (int i = 0; i < n; i++)
2231 {
2232 renderbuffers[i] = context->createRenderbuffer();
2233 }
2234 }
2235 }
2236 catch(std::bad_alloc&)
2237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002238 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239 }
2240}
2241
2242void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2243{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002244 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 try
2247 {
2248 if (n < 0)
2249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251 }
2252
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002253 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254
2255 if (context)
2256 {
2257 for (int i = 0; i < n; i++)
2258 {
2259 textures[i] = context->createTexture();
2260 }
2261 }
2262 }
2263 catch(std::bad_alloc&)
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267}
2268
daniel@transgaming.com85423182010-04-22 13:35:27 +00002269void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002271 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002272 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002273 program, index, bufsize, length, size, type, name);
2274
2275 try
2276 {
2277 if (bufsize < 0)
2278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002280 }
2281
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002283
2284 if (context)
2285 {
2286 gl::Program *programObject = context->getProgram(program);
2287
2288 if (!programObject)
2289 {
2290 if (context->getShader(program))
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002293 }
2294 else
2295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002297 }
2298 }
2299
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002300 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002303 }
2304
2305 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2306 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307 }
2308 catch(std::bad_alloc&)
2309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 }
2312}
2313
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002314void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002316 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002317 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318 program, index, bufsize, length, size, type, name);
2319
2320 try
2321 {
2322 if (bufsize < 0)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002328
2329 if (context)
2330 {
2331 gl::Program *programObject = context->getProgram(program);
2332
2333 if (!programObject)
2334 {
2335 if (context->getShader(program))
2336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002338 }
2339 else
2340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002342 }
2343 }
2344
2345 if (index >= (GLuint)programObject->getActiveUniformCount())
2346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002348 }
2349
2350 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2351 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002362 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 if (maxcount < 0)
2367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002372
2373 if (context)
2374 {
2375 gl::Program *programObject = context->getProgram(program);
2376
2377 if (!programObject)
2378 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002379 if (context->getShader(program))
2380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002381 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002382 }
2383 else
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002386 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002387 }
2388
2389 return programObject->getAttachedShaders(maxcount, count, shaders);
2390 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391 }
2392 catch(std::bad_alloc&)
2393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002394 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395 }
2396}
2397
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002398int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002400 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401
2402 try
2403 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405
2406 if (context)
2407 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409 gl::Program *programObject = context->getProgram(program);
2410
2411 if (!programObject)
2412 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002413 if (context->getShader(program))
2414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002415 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002416 }
2417 else
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421 }
2422
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002423 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002424 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002426 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002427 }
2428
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002429 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 }
2431 }
2432 catch(std::bad_alloc&)
2433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002434 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 }
2436
2437 return -1;
2438}
2439
2440void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002442 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443
2444 try
2445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002447
2448 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002450 GLenum nativeType;
2451 unsigned int numParams = 0;
2452 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2453 return gl::error(GL_INVALID_ENUM);
2454
2455 // pname is valid, but there are no parameters to return
2456 if (numParams == 0)
2457 return;
2458
2459 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002460 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002461 context->getBooleanv(pname, params);
2462 }
Jamie Madill55856b12014-01-02 13:59:50 -05002463 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002464 {
Jamie Madill55856b12014-01-02 13:59:50 -05002465 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468 }
2469 catch(std::bad_alloc&)
2470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 }
2473}
2474
2475void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002477 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478
2479 try
2480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002482
2483 if (context)
2484 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002485 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002486 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002487 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002488 }
2489
Jamie Madill8c96d582014-03-05 15:01:23 -05002490 gl::Buffer *buffer = context->getTargetBuffer(target);
2491
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002492 if (!buffer)
2493 {
2494 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002495 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002496 }
2497
2498 switch (pname)
2499 {
2500 case GL_BUFFER_USAGE:
2501 *params = buffer->usage();
2502 break;
2503 case GL_BUFFER_SIZE:
2504 *params = buffer->size();
2505 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002506 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002507 }
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509 }
2510 catch(std::bad_alloc&)
2511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514}
2515
2516GLenum __stdcall glGetError(void)
2517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002518 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
2520 gl::Context *context = gl::getContext();
2521
2522 if (context)
2523 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002524 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002525 }
2526
2527 return GL_NO_ERROR;
2528}
2529
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002530void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002532 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002533
2534 try
2535 {
2536
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002537 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002538
2539 if (context)
2540 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002541 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002542
2543 if (fenceObject == NULL)
2544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002545 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002546 }
2547
Jamie Madillfb9a7402013-07-26 11:55:01 -04002548 if (fenceObject->isFence() != GL_TRUE)
2549 {
2550 return gl::error(GL_INVALID_OPERATION);
2551 }
2552
2553 switch (pname)
2554 {
2555 case GL_FENCE_STATUS_NV:
2556 case GL_FENCE_CONDITION_NV:
2557 break;
2558
2559 default: return gl::error(GL_INVALID_ENUM);
2560 }
2561
2562 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002563 }
2564 }
2565 catch(std::bad_alloc&)
2566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002567 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002568 }
2569}
2570
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2572{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002573 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002574
2575 try
2576 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002577 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002578
2579 if (context)
2580 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002581 GLenum nativeType;
2582 unsigned int numParams = 0;
2583 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2584 return gl::error(GL_INVALID_ENUM);
2585
2586 // pname is valid, but that there are no parameters to return.
2587 if (numParams == 0)
2588 return;
2589
2590 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002591 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002592 context->getFloatv(pname, params);
2593 }
Jamie Madill55856b12014-01-02 13:59:50 -05002594 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002595 {
Jamie Madill55856b12014-01-02 13:59:50 -05002596 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002597 }
2598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002599 }
2600 catch(std::bad_alloc&)
2601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002603 }
2604}
2605
2606void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002608 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 +00002609 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002610
2611 try
2612 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002613 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002614
2615 if (context)
2616 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002617 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002619 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002620 }
2621
Geoff Lang646559f2013-08-15 11:08:15 -04002622 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002623 {
Geoff Lang646559f2013-08-15 11:08:15 -04002624 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2625 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2626 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2627 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2628 break;
2629 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2630 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2631 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2632 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2633 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2634 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2635 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2636 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2637 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2638 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002639 {
Geoff Lang646559f2013-08-15 11:08:15 -04002640 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002641 }
Geoff Lang646559f2013-08-15 11:08:15 -04002642 default:
2643 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002644 }
Geoff Lang646559f2013-08-15 11:08:15 -04002645
2646 // Determine if the attachment is a valid enum
2647 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002648 {
Geoff Lang646559f2013-08-15 11:08:15 -04002649 case GL_BACK:
2650 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002651 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002652 case GL_STENCIL:
2653 case GL_DEPTH_STENCIL_ATTACHMENT:
2654 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002655 {
Geoff Lang646559f2013-08-15 11:08:15 -04002656 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002657 }
Geoff Lang646559f2013-08-15 11:08:15 -04002658 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002659
Geoff Lang646559f2013-08-15 11:08:15 -04002660 case GL_DEPTH_ATTACHMENT:
2661 case GL_STENCIL_ATTACHMENT:
2662 break;
2663
2664 default:
2665 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2666 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2667 {
2668 return gl::error(GL_INVALID_ENUM);
2669 }
2670 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002671 }
2672
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002673 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2674 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002675 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2676
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002677 GLenum attachmentType;
2678 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002679 GLuint attachmentLevel;
2680 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002681 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002682
Geoff Lang646559f2013-08-15 11:08:15 -04002683 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002684 {
Geoff Lang646559f2013-08-15 11:08:15 -04002685 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002686 {
Geoff Lang646559f2013-08-15 11:08:15 -04002687 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002688 }
2689
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002690 switch (attachment)
2691 {
Geoff Lang646559f2013-08-15 11:08:15 -04002692 case GL_BACK:
2693 attachmentType = framebuffer->getColorbufferType(0);
2694 attachmentHandle = framebuffer->getColorbufferHandle(0);
2695 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2696 attachmentLayer = framebuffer->getColorbufferLayer(0);
2697 renderbuffer = framebuffer->getColorbuffer(0);
2698 break;
2699 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002700 attachmentType = framebuffer->getDepthbufferType();
2701 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002702 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2703 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002704 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002705 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002706 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002707 attachmentType = framebuffer->getStencilbufferType();
2708 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002709 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2710 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002711 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002712 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002713 default:
2714 return gl::error(GL_INVALID_OPERATION);
2715 }
2716 }
2717 else
2718 {
2719 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2720 {
2721 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2722 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2723 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2724 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2725 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2726 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2727 }
2728 else
2729 {
2730 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002731 {
Geoff Lang646559f2013-08-15 11:08:15 -04002732 case GL_DEPTH_ATTACHMENT:
2733 attachmentType = framebuffer->getDepthbufferType();
2734 attachmentHandle = framebuffer->getDepthbufferHandle();
2735 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2736 attachmentLayer = framebuffer->getDepthbufferLayer();
2737 renderbuffer = framebuffer->getDepthbuffer();
2738 break;
2739 case GL_STENCIL_ATTACHMENT:
2740 attachmentType = framebuffer->getStencilbufferType();
2741 attachmentHandle = framebuffer->getStencilbufferHandle();
2742 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2743 attachmentLayer = framebuffer->getStencilbufferLayer();
2744 renderbuffer = framebuffer->getStencilbuffer();
2745 break;
2746 case GL_DEPTH_STENCIL_ATTACHMENT:
2747 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2748 {
2749 return gl::error(GL_INVALID_OPERATION);
2750 }
2751 attachmentType = framebuffer->getDepthStencilbufferType();
2752 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2753 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2754 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2755 renderbuffer = framebuffer->getDepthStencilBuffer();
2756 break;
2757 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002758 return gl::error(GL_INVALID_OPERATION);
2759 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002760 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002761 }
2762
2763 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002764 if (framebufferHandle == 0)
2765 {
2766 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2767 }
2768 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002769 {
2770 attachmentObjectType = attachmentType;
2771 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002772 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002773 {
2774 attachmentObjectType = GL_TEXTURE;
2775 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002776 else
2777 {
2778 UNREACHABLE();
2779 return;
2780 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002781
Geoff Lang646559f2013-08-15 11:08:15 -04002782 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002783 {
Geoff Lang646559f2013-08-15 11:08:15 -04002784 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2785 // is NONE, then querying any other pname will generate INVALID_ENUM.
2786
2787 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2788 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2789 // INVALID_OPERATION for all other pnames
2790
2791 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002792 {
Geoff Lang646559f2013-08-15 11:08:15 -04002793 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2794 *params = attachmentObjectType;
2795 break;
2796
2797 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2798 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002799 {
Geoff Lang646559f2013-08-15 11:08:15 -04002800 return gl::error(GL_INVALID_ENUM);
2801 }
2802 *params = 0;
2803 break;
2804
2805 default:
2806 if (context->getClientVersion() < 3)
2807 {
2808 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002809 }
2810 else
2811 {
Geoff Lang646559f2013-08-15 11:08:15 -04002812 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002813 }
2814 }
Geoff Lang646559f2013-08-15 11:08:15 -04002815 }
2816 else
2817 {
2818 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2819 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2820 ASSERT(renderbuffer != NULL);
2821
2822 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002823 {
Geoff Lang646559f2013-08-15 11:08:15 -04002824 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2825 *params = attachmentObjectType;
2826 break;
2827
2828 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2829 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2830 {
2831 return gl::error(GL_INVALID_ENUM);
2832 }
2833 *params = attachmentHandle;
2834 break;
2835
2836 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2837 if (attachmentObjectType != GL_TEXTURE)
2838 {
2839 return gl::error(GL_INVALID_ENUM);
2840 }
2841 *params = attachmentLevel;
2842 break;
2843
2844 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2845 if (attachmentObjectType != GL_TEXTURE)
2846 {
2847 return gl::error(GL_INVALID_ENUM);
2848 }
2849 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2850 break;
2851
2852 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2853 *params = renderbuffer->getRedSize();
2854 break;
2855
2856 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2857 *params = renderbuffer->getGreenSize();
2858 break;
2859
2860 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2861 *params = renderbuffer->getBlueSize();
2862 break;
2863
2864 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2865 *params = renderbuffer->getAlphaSize();
2866 break;
2867
2868 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2869 *params = renderbuffer->getDepthSize();
2870 break;
2871
2872 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2873 *params = renderbuffer->getStencilSize();
2874 break;
2875
2876 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2877 if (attachment == GL_DEPTH_STENCIL)
2878 {
2879 gl::error(GL_INVALID_OPERATION);
2880 }
2881 *params = renderbuffer->getComponentType();
2882 break;
2883
2884 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2885 *params = renderbuffer->getColorEncoding();
2886 break;
2887
2888 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2889 if (attachmentObjectType != GL_TEXTURE)
2890 {
2891 return gl::error(GL_INVALID_ENUM);
2892 }
2893 *params = attachmentLayer;
2894 break;
2895
2896 default:
2897 UNREACHABLE();
2898 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002899 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002900 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002901 }
2902 }
2903 catch(std::bad_alloc&)
2904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002906 }
2907}
2908
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002909GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2910{
2911 EVENT("()");
2912
2913 try
2914 {
2915 gl::Context *context = gl::getContext();
2916
2917 if (context)
2918 {
2919 return context->getResetStatus();
2920 }
2921
2922 return GL_NO_ERROR;
2923 }
2924 catch(std::bad_alloc&)
2925 {
2926 return GL_OUT_OF_MEMORY;
2927 }
2928}
2929
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002930void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002932 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933
2934 try
2935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937
2938 if (context)
2939 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002940 GLenum nativeType;
2941 unsigned int numParams = 0;
2942 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2943 return gl::error(GL_INVALID_ENUM);
2944
2945 // pname is valid, but there are no parameters to return
2946 if (numParams == 0)
2947 return;
2948
2949 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002950 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002951 context->getIntegerv(pname, params);
2952 }
Jamie Madill55856b12014-01-02 13:59:50 -05002953 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002954 {
Jamie Madill55856b12014-01-02 13:59:50 -05002955 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956 }
2957 }
2958 }
2959 catch(std::bad_alloc&)
2960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 }
2963}
2964
2965void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002967 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968
2969 try
2970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002972
2973 if (context)
2974 {
2975 gl::Program *programObject = context->getProgram(program);
2976
2977 if (!programObject)
2978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002979 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002980 }
2981
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002982 if (context->getClientVersion() < 3)
2983 {
2984 switch (pname)
2985 {
2986 case GL_ACTIVE_UNIFORM_BLOCKS:
2987 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2988 return gl::error(GL_INVALID_ENUM);
2989 }
2990 }
2991
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002992 switch (pname)
2993 {
2994 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002995 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996 return;
2997 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002998 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 return;
3000 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003001 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 return;
3003 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003004 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003005 return;
3006 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003007 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 return;
3009 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003010 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003011 return;
3012 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003013 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003014 return;
3015 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003016 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 return;
3018 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003019 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003021 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003022 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003023 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003024 case GL_ACTIVE_UNIFORM_BLOCKS:
3025 *params = programObject->getActiveUniformBlockCount();
3026 return;
3027 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3028 *params = programObject->getActiveUniformBlockMaxLength();
3029 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003031 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003032 }
3033 }
3034 }
3035 catch(std::bad_alloc&)
3036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003037 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003038 }
3039}
3040
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003041void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003042{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003043 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 +00003044 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003045
3046 try
3047 {
3048 if (bufsize < 0)
3049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051 }
3052
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003054
3055 if (context)
3056 {
3057 gl::Program *programObject = context->getProgram(program);
3058
3059 if (!programObject)
3060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003061 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003062 }
3063
3064 programObject->getInfoLog(bufsize, length, infolog);
3065 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066 }
3067 catch(std::bad_alloc&)
3068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003070 }
3071}
3072
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003073void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3074{
3075 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3076
3077 try
3078 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003079 gl::Context *context = gl::getNonLostContext();
3080
3081 if (context)
3082 {
Geoff Lang37dde692014-01-31 16:34:54 -05003083 if (!ValidQueryType(context, target))
3084 {
3085 return gl::error(GL_INVALID_ENUM);
3086 }
3087
3088 switch (pname)
3089 {
3090 case GL_CURRENT_QUERY_EXT:
3091 params[0] = context->getActiveQuery(target);
3092 break;
3093
3094 default:
3095 return gl::error(GL_INVALID_ENUM);
3096 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003097 }
3098 }
3099 catch(std::bad_alloc&)
3100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003102 }
3103}
3104
3105void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3106{
3107 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3108
3109 try
3110 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003111 gl::Context *context = gl::getNonLostContext();
3112
3113 if (context)
3114 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003115 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3116
3117 if (!queryObject)
3118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003119 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003120 }
3121
3122 if (context->getActiveQuery(queryObject->getType()) == id)
3123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003124 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003125 }
3126
3127 switch(pname)
3128 {
3129 case GL_QUERY_RESULT_EXT:
3130 params[0] = queryObject->getResult();
3131 break;
3132 case GL_QUERY_RESULT_AVAILABLE_EXT:
3133 params[0] = queryObject->isResultAvailable();
3134 break;
3135 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003136 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003137 }
3138 }
3139 }
3140 catch(std::bad_alloc&)
3141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003142 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003143 }
3144}
3145
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003146void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003148 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 +00003149
3150 try
3151 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003152 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003153
3154 if (context)
3155 {
3156 if (target != GL_RENDERBUFFER)
3157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003158 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003159 }
3160
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003161 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003164 }
3165
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003166 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003167
3168 switch (pname)
3169 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003170 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3171 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3172 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3173 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3174 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3175 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3176 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3177 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3178 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003179 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003180 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003181 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003182 *params = renderbuffer->getSamples();
3183 }
3184 else
3185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003186 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003187 }
3188 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003189 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003190 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003191 }
3192 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003193 }
3194 catch(std::bad_alloc&)
3195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003196 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197 }
3198}
3199
3200void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3201{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003202 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003203
3204 try
3205 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003206 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003207
3208 if (context)
3209 {
3210 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003211
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003212 if (!shaderObject)
3213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003214 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215 }
3216
3217 switch (pname)
3218 {
3219 case GL_SHADER_TYPE:
3220 *params = shaderObject->getType();
3221 return;
3222 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003223 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224 return;
3225 case GL_COMPILE_STATUS:
3226 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3227 return;
3228 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003229 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230 return;
3231 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003232 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003233 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003234 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3235 *params = shaderObject->getTranslatedSourceLength();
3236 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003239 }
3240 }
3241 }
3242 catch(std::bad_alloc&)
3243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003244 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003245 }
3246}
3247
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003248void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003249{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003250 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 +00003251 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003252
3253 try
3254 {
3255 if (bufsize < 0)
3256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003258 }
3259
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003261
3262 if (context)
3263 {
3264 gl::Shader *shaderObject = context->getShader(shader);
3265
3266 if (!shaderObject)
3267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003269 }
3270
3271 shaderObject->getInfoLog(bufsize, length, infolog);
3272 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 }
3274 catch(std::bad_alloc&)
3275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277 }
3278}
3279
3280void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3281{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003282 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 +00003283 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284
3285 try
3286 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003287 switch (shadertype)
3288 {
3289 case GL_VERTEX_SHADER:
3290 case GL_FRAGMENT_SHADER:
3291 break;
3292 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003293 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003294 }
3295
3296 switch (precisiontype)
3297 {
3298 case GL_LOW_FLOAT:
3299 case GL_MEDIUM_FLOAT:
3300 case GL_HIGH_FLOAT:
3301 // Assume IEEE 754 precision
3302 range[0] = 127;
3303 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003304 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003305 break;
3306 case GL_LOW_INT:
3307 case GL_MEDIUM_INT:
3308 case GL_HIGH_INT:
3309 // Some (most) hardware only supports single-precision floating-point numbers,
3310 // which can accurately represent integers up to +/-16777216
3311 range[0] = 24;
3312 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003313 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003314 break;
3315 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003316 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003317 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318 }
3319 catch(std::bad_alloc&)
3320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003321 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 }
3323}
3324
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003325void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003327 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 +00003328 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329
3330 try
3331 {
3332 if (bufsize < 0)
3333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003335 }
3336
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003338
3339 if (context)
3340 {
3341 gl::Shader *shaderObject = context->getShader(shader);
3342
3343 if (!shaderObject)
3344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003345 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003346 }
3347
3348 shaderObject->getSource(bufsize, length, source);
3349 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003350 }
3351 catch(std::bad_alloc&)
3352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003353 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354 }
3355}
3356
zmo@google.coma574f782011-10-03 21:45:23 +00003357void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3358{
3359 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3360 shader, bufsize, length, source);
3361
3362 try
3363 {
3364 if (bufsize < 0)
3365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003366 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003367 }
3368
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003369 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003370
3371 if (context)
3372 {
3373 gl::Shader *shaderObject = context->getShader(shader);
3374
3375 if (!shaderObject)
3376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003378 }
3379
3380 shaderObject->getTranslatedSource(bufsize, length, source);
3381 }
3382 }
3383 catch(std::bad_alloc&)
3384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003385 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003386 }
3387}
3388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389const GLubyte* __stdcall glGetString(GLenum name)
3390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003391 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003392
3393 try
3394 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003396
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397 switch (name)
3398 {
3399 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003400 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003401 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003402 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003404 if (context->getClientVersion() == 2)
3405 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003406 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003407 }
3408 else
3409 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003410 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003411 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003413 if (context->getClientVersion() == 2)
3414 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003415 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003416 }
3417 else
3418 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003419 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003422 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003424 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003425 }
3426 }
3427 catch(std::bad_alloc&)
3428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003429 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003431}
3432
3433void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003435 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 +00003436
3437 try
3438 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003440
3441 if (context)
3442 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003443 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003444
Jamie Madillfb8a8302013-07-03 14:24:12 -04003445 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003447 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003448 }
3449
3450 switch (pname)
3451 {
3452 case GL_TEXTURE_MAG_FILTER:
3453 *params = (GLfloat)texture->getMagFilter();
3454 break;
3455 case GL_TEXTURE_MIN_FILTER:
3456 *params = (GLfloat)texture->getMinFilter();
3457 break;
3458 case GL_TEXTURE_WRAP_S:
3459 *params = (GLfloat)texture->getWrapS();
3460 break;
3461 case GL_TEXTURE_WRAP_T:
3462 *params = (GLfloat)texture->getWrapT();
3463 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003464 case GL_TEXTURE_WRAP_R:
3465 if (context->getClientVersion() < 3)
3466 {
3467 return gl::error(GL_INVALID_ENUM);
3468 }
3469 *params = (GLfloat)texture->getWrapR();
3470 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003471 case GL_TEXTURE_IMMUTABLE_FORMAT:
3472 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003473 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3474 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003475 case GL_TEXTURE_IMMUTABLE_LEVELS:
3476 if (context->getClientVersion() < 3)
3477 {
3478 return gl::error(GL_INVALID_ENUM);
3479 }
Jamie Madill51a94372013-10-24 17:49:43 -04003480 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003481 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003482 case GL_TEXTURE_USAGE_ANGLE:
3483 *params = (GLfloat)texture->getUsage();
3484 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003485 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3486 if (!context->supportsTextureFilterAnisotropy())
3487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003488 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003489 }
3490 *params = (GLfloat)texture->getMaxAnisotropy();
3491 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003492 case GL_TEXTURE_SWIZZLE_R:
3493 if (context->getClientVersion() < 3)
3494 {
3495 return gl::error(GL_INVALID_ENUM);
3496 }
3497 *params = (GLfloat)texture->getSwizzleRed();
3498 break;
3499 case GL_TEXTURE_SWIZZLE_G:
3500 if (context->getClientVersion() < 3)
3501 {
3502 return gl::error(GL_INVALID_ENUM);
3503 }
3504 *params = (GLfloat)texture->getSwizzleGreen();
3505 break;
3506 case GL_TEXTURE_SWIZZLE_B:
3507 if (context->getClientVersion() < 3)
3508 {
3509 return gl::error(GL_INVALID_ENUM);
3510 }
3511 *params = (GLfloat)texture->getSwizzleBlue();
3512 break;
3513 case GL_TEXTURE_SWIZZLE_A:
3514 if (context->getClientVersion() < 3)
3515 {
3516 return gl::error(GL_INVALID_ENUM);
3517 }
3518 *params = (GLfloat)texture->getSwizzleAlpha();
3519 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003522 }
3523 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003524 }
3525 catch(std::bad_alloc&)
3526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003528 }
3529}
3530
3531void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003533 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 +00003534
3535 try
3536 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003538
3539 if (context)
3540 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003541 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003542
Jamie Madillfb8a8302013-07-03 14:24:12 -04003543 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003545 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003546 }
3547
3548 switch (pname)
3549 {
3550 case GL_TEXTURE_MAG_FILTER:
3551 *params = texture->getMagFilter();
3552 break;
3553 case GL_TEXTURE_MIN_FILTER:
3554 *params = texture->getMinFilter();
3555 break;
3556 case GL_TEXTURE_WRAP_S:
3557 *params = texture->getWrapS();
3558 break;
3559 case GL_TEXTURE_WRAP_T:
3560 *params = texture->getWrapT();
3561 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003562 case GL_TEXTURE_WRAP_R:
3563 if (context->getClientVersion() < 3)
3564 {
3565 return gl::error(GL_INVALID_ENUM);
3566 }
3567 *params = texture->getWrapR();
3568 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003569 case GL_TEXTURE_IMMUTABLE_FORMAT:
3570 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003571 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3572 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003573 case GL_TEXTURE_IMMUTABLE_LEVELS:
3574 if (context->getClientVersion() < 3)
3575 {
3576 return gl::error(GL_INVALID_ENUM);
3577 }
Jamie Madill51a94372013-10-24 17:49:43 -04003578 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003579 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003580 case GL_TEXTURE_USAGE_ANGLE:
3581 *params = texture->getUsage();
3582 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003583 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3584 if (!context->supportsTextureFilterAnisotropy())
3585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003587 }
3588 *params = (GLint)texture->getMaxAnisotropy();
3589 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003590 case GL_TEXTURE_SWIZZLE_R:
3591 if (context->getClientVersion() < 3)
3592 {
3593 return gl::error(GL_INVALID_ENUM);
3594 }
3595 *params = texture->getSwizzleRed();
3596 break;
3597 case GL_TEXTURE_SWIZZLE_G:
3598 if (context->getClientVersion() < 3)
3599 {
3600 return gl::error(GL_INVALID_ENUM);
3601 }
3602 *params = texture->getSwizzleGreen();
3603 break;
3604 case GL_TEXTURE_SWIZZLE_B:
3605 if (context->getClientVersion() < 3)
3606 {
3607 return gl::error(GL_INVALID_ENUM);
3608 }
3609 *params = texture->getSwizzleBlue();
3610 break;
3611 case GL_TEXTURE_SWIZZLE_A:
3612 if (context->getClientVersion() < 3)
3613 {
3614 return gl::error(GL_INVALID_ENUM);
3615 }
3616 *params = texture->getSwizzleAlpha();
3617 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003618
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003619 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003621 }
3622 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003623 }
3624 catch(std::bad_alloc&)
3625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003627 }
3628}
3629
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003630void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3631{
3632 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3633 program, location, bufSize, params);
3634
3635 try
3636 {
3637 if (bufSize < 0)
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003640 }
3641
3642 gl::Context *context = gl::getNonLostContext();
3643
3644 if (context)
3645 {
3646 if (program == 0)
3647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003648 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003649 }
3650
3651 gl::Program *programObject = context->getProgram(program);
3652
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003653 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003656 }
3657
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003658 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3659 if (!programBinary)
3660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003661 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003662 }
3663
3664 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003666 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003667 }
3668 }
3669 }
3670 catch(std::bad_alloc&)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003673 }
3674}
3675
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003676void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003678 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679
3680 try
3681 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003683
3684 if (context)
3685 {
3686 if (program == 0)
3687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003689 }
3690
3691 gl::Program *programObject = context->getProgram(program);
3692
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003693 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003696 }
3697
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003698 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3699 if (!programBinary)
3700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003701 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003702 }
3703
3704 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003707 }
3708 }
3709 }
3710 catch(std::bad_alloc&)
3711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003713 }
3714}
3715
3716void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3717{
3718 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3719 program, location, bufSize, params);
3720
3721 try
3722 {
3723 if (bufSize < 0)
3724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003726 }
3727
3728 gl::Context *context = gl::getNonLostContext();
3729
3730 if (context)
3731 {
3732 if (program == 0)
3733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003735 }
3736
3737 gl::Program *programObject = context->getProgram(program);
3738
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003739 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003742 }
3743
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003744 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3745 if (!programBinary)
3746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003747 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003748 }
3749
3750 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003753 }
3754 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003755 }
3756 catch(std::bad_alloc&)
3757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003759 }
3760}
3761
3762void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003764 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003765
3766 try
3767 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003769
3770 if (context)
3771 {
3772 if (program == 0)
3773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003775 }
3776
3777 gl::Program *programObject = context->getProgram(program);
3778
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003779 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003782 }
3783
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003784 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3785 if (!programBinary)
3786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003787 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003788 }
3789
3790 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003793 }
3794 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003795 }
3796 catch(std::bad_alloc&)
3797 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003798 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003799 }
3800}
3801
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003802int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003804 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805
3806 try
3807 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003808 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003809
3810 if (strstr(name, "gl_") == name)
3811 {
3812 return -1;
3813 }
3814
3815 if (context)
3816 {
3817 gl::Program *programObject = context->getProgram(program);
3818
3819 if (!programObject)
3820 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003821 if (context->getShader(program))
3822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003823 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003824 }
3825 else
3826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003827 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003828 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003829 }
3830
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003831 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003832 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003834 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835 }
3836
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003837 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003838 }
3839 }
3840 catch(std::bad_alloc&)
3841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003842 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003843 }
3844
3845 return -1;
3846}
3847
3848void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3849{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003850 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003851
3852 try
3853 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003855
daniel@transgaming.come0078962010-04-15 20:45:08 +00003856 if (context)
3857 {
3858 if (index >= gl::MAX_VERTEX_ATTRIBS)
3859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003861 }
3862
daniel@transgaming.com83921382011-01-08 05:46:00 +00003863 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003864
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003865 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003866 {
Jamie Madillaff71502013-07-02 11:57:05 -04003867 return;
3868 }
3869
3870 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3871 {
3872 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3873 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003874 {
Jamie Madillaff71502013-07-02 11:57:05 -04003875 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003876 }
Jamie Madillaff71502013-07-02 11:57:05 -04003877 }
3878 else
3879 {
3880 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003881 }
3882 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003883 }
3884 catch(std::bad_alloc&)
3885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003886 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887 }
3888}
3889
3890void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3891{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003892 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893
3894 try
3895 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003896 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003897
daniel@transgaming.come0078962010-04-15 20:45:08 +00003898 if (context)
3899 {
3900 if (index >= gl::MAX_VERTEX_ATTRIBS)
3901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003902 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003903 }
3904
daniel@transgaming.com83921382011-01-08 05:46:00 +00003905 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003906
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003907 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003908 {
Jamie Madillaff71502013-07-02 11:57:05 -04003909 return;
3910 }
3911
3912 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3913 {
3914 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3915 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003916 {
Jamie Madillaff71502013-07-02 11:57:05 -04003917 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003918 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003919 }
Jamie Madillaff71502013-07-02 11:57:05 -04003920 }
3921 else
3922 {
3923 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003924 }
3925 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926 }
3927 catch(std::bad_alloc&)
3928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003930 }
3931}
3932
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003933void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003935 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936
3937 try
3938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940
daniel@transgaming.come0078962010-04-15 20:45:08 +00003941 if (context)
3942 {
3943 if (index >= gl::MAX_VERTEX_ATTRIBS)
3944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003945 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003946 }
3947
3948 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003950 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003951 }
3952
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003953 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003955 }
3956 catch(std::bad_alloc&)
3957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003959 }
3960}
3961
3962void __stdcall glHint(GLenum target, GLenum mode)
3963{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003964 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965
3966 try
3967 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003968 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003969 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003970 case GL_FASTEST:
3971 case GL_NICEST:
3972 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003973 break;
3974 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003975 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003976 }
3977
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003978 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003979 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003980 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003981 case GL_GENERATE_MIPMAP_HINT:
3982 if (context) context->setGenerateMipmapHint(mode);
3983 break;
3984 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3985 if (context) context->setFragmentShaderDerivativeHint(mode);
3986 break;
3987 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003988 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003990 }
3991 catch(std::bad_alloc&)
3992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003993 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 }
3995}
3996
3997GLboolean __stdcall glIsBuffer(GLuint buffer)
3998{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003999 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004000
4001 try
4002 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004003 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004
4005 if (context && buffer)
4006 {
4007 gl::Buffer *bufferObject = context->getBuffer(buffer);
4008
4009 if (bufferObject)
4010 {
4011 return GL_TRUE;
4012 }
4013 }
4014 }
4015 catch(std::bad_alloc&)
4016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004018 }
4019
4020 return GL_FALSE;
4021}
4022
4023GLboolean __stdcall glIsEnabled(GLenum cap)
4024{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004025 EVENT("(GLenum cap = 0x%X)", cap);
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
4031 if (context)
4032 {
Geoff Lang0550d032014-01-30 11:29:07 -05004033 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004035 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004036 }
Geoff Lang0550d032014-01-30 11:29:07 -05004037
4038 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039 }
4040 }
4041 catch(std::bad_alloc&)
4042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 }
4045
4046 return false;
4047}
4048
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004049GLboolean __stdcall glIsFenceNV(GLuint fence)
4050{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004051 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004052
4053 try
4054 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004055 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004056
4057 if (context)
4058 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004059 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004060
4061 if (fenceObject == NULL)
4062 {
4063 return GL_FALSE;
4064 }
4065
4066 return fenceObject->isFence();
4067 }
4068 }
4069 catch(std::bad_alloc&)
4070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004071 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004072 }
4073
4074 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004075}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004076
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004079 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080
4081 try
4082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084
4085 if (context && framebuffer)
4086 {
4087 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4088
4089 if (framebufferObject)
4090 {
4091 return GL_TRUE;
4092 }
4093 }
4094 }
4095 catch(std::bad_alloc&)
4096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004097 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004098 }
4099
4100 return GL_FALSE;
4101}
4102
4103GLboolean __stdcall glIsProgram(GLuint program)
4104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004105 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106
4107 try
4108 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004109 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004110
4111 if (context && program)
4112 {
4113 gl::Program *programObject = context->getProgram(program);
4114
4115 if (programObject)
4116 {
4117 return GL_TRUE;
4118 }
4119 }
4120 }
4121 catch(std::bad_alloc&)
4122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 }
4125
4126 return GL_FALSE;
4127}
4128
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004129GLboolean __stdcall glIsQueryEXT(GLuint id)
4130{
4131 EVENT("(GLuint id = %d)", id);
4132
4133 try
4134 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004135 gl::Context *context = gl::getNonLostContext();
4136
4137 if (context)
4138 {
Geoff Lang37dde692014-01-31 16:34:54 -05004139 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004140 }
4141 }
4142 catch(std::bad_alloc&)
4143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004144 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004145 }
4146
4147 return GL_FALSE;
4148}
4149
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004150GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004152 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153
4154 try
4155 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004156 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004157
4158 if (context && renderbuffer)
4159 {
4160 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4161
4162 if (renderbufferObject)
4163 {
4164 return GL_TRUE;
4165 }
4166 }
4167 }
4168 catch(std::bad_alloc&)
4169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004170 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004171 }
4172
4173 return GL_FALSE;
4174}
4175
4176GLboolean __stdcall glIsShader(GLuint shader)
4177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004178 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179
4180 try
4181 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004182 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004183
4184 if (context && shader)
4185 {
4186 gl::Shader *shaderObject = context->getShader(shader);
4187
4188 if (shaderObject)
4189 {
4190 return GL_TRUE;
4191 }
4192 }
4193 }
4194 catch(std::bad_alloc&)
4195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004196 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004197 }
4198
4199 return GL_FALSE;
4200}
4201
4202GLboolean __stdcall glIsTexture(GLuint texture)
4203{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004204 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004205
4206 try
4207 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209
4210 if (context && texture)
4211 {
4212 gl::Texture *textureObject = context->getTexture(texture);
4213
4214 if (textureObject)
4215 {
4216 return GL_TRUE;
4217 }
4218 }
4219 }
4220 catch(std::bad_alloc&)
4221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004222 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223 }
4224
4225 return GL_FALSE;
4226}
4227
4228void __stdcall glLineWidth(GLfloat width)
4229{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004230 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004231
4232 try
4233 {
4234 if (width <= 0.0f)
4235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004236 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004237 }
4238
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004239 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004240
4241 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004242 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004243 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244 }
4245 }
4246 catch(std::bad_alloc&)
4247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004249 }
4250}
4251
4252void __stdcall glLinkProgram(GLuint program)
4253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004254 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004255
4256 try
4257 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004259
4260 if (context)
4261 {
4262 gl::Program *programObject = context->getProgram(program);
4263
4264 if (!programObject)
4265 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004266 if (context->getShader(program))
4267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004268 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004269 }
4270 else
4271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004273 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004274 }
4275
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004276 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277 }
4278 }
4279 catch(std::bad_alloc&)
4280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 }
4283}
4284
4285void __stdcall glPixelStorei(GLenum pname, GLint param)
4286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004287 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288
4289 try
4290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004292
4293 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004295 switch (pname)
4296 {
4297 case GL_UNPACK_ALIGNMENT:
4298 if (param != 1 && param != 2 && param != 4 && param != 8)
4299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004300 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004301 }
4302
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004303 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004304 break;
4305
4306 case GL_PACK_ALIGNMENT:
4307 if (param != 1 && param != 2 && param != 4 && param != 8)
4308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004309 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004310 }
4311
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004312 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004313 break;
4314
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004315 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4316 context->setPackReverseRowOrder(param != 0);
4317 break;
4318
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004319 case GL_UNPACK_IMAGE_HEIGHT:
4320 case GL_UNPACK_SKIP_IMAGES:
4321 case GL_UNPACK_ROW_LENGTH:
4322 case GL_UNPACK_SKIP_ROWS:
4323 case GL_UNPACK_SKIP_PIXELS:
4324 case GL_PACK_ROW_LENGTH:
4325 case GL_PACK_SKIP_ROWS:
4326 case GL_PACK_SKIP_PIXELS:
4327 if (context->getClientVersion() < 3)
4328 {
4329 return gl::error(GL_INVALID_ENUM);
4330 }
4331 UNIMPLEMENTED();
4332 break;
4333
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004334 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004335 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004336 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337 }
4338 }
4339 catch(std::bad_alloc&)
4340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004341 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 }
4343}
4344
4345void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4346{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004347 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004348
4349 try
4350 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004352
4353 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004355 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356 }
4357 }
4358 catch(std::bad_alloc&)
4359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004361 }
4362}
4363
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004364void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4365 GLenum format, GLenum type, GLsizei bufSize,
4366 GLvoid *data)
4367{
4368 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4369 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4370 x, y, width, height, format, type, bufSize, data);
4371
4372 try
4373 {
4374 if (width < 0 || height < 0 || bufSize < 0)
4375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004377 }
4378
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004379 gl::Context *context = gl::getNonLostContext();
4380
4381 if (context)
4382 {
Geoff Lang005df412013-10-16 14:12:50 -04004383 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004384
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004385 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4386 // and attempting to read back if that's the case is an error. The error will be registered
4387 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004388 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004389 return;
4390
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004391 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4392 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004393
4394 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004396 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004397 }
4398
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004399 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4400 }
4401 }
4402 catch(std::bad_alloc&)
4403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004404 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004405 }
4406}
4407
4408void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4409 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004410{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004411 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004412 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004413 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414
4415 try
4416 {
4417 if (width < 0 || height < 0)
4418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004419 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004420 }
4421
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004422 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423
4424 if (context)
4425 {
Geoff Lang005df412013-10-16 14:12:50 -04004426 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004427
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004428 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4429 // and attempting to read back if that's the case is an error. The error will be registered
4430 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004431 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004432 return;
4433
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004434 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4435 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004436
4437 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004439 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004440 }
4441
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004442 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004443 }
4444 }
4445 catch(std::bad_alloc&)
4446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448 }
4449}
4450
4451void __stdcall glReleaseShaderCompiler(void)
4452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004453 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004454
4455 try
4456 {
4457 gl::Shader::releaseCompiler();
4458 }
4459 catch(std::bad_alloc&)
4460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004461 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004462 }
4463}
4464
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004465void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004467 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 +00004468 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469
4470 try
4471 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004472 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473
4474 if (context)
4475 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004476 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004477 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004478 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004479 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004480 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004481
4482 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004483 }
4484 }
4485 catch(std::bad_alloc&)
4486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004487 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004488 }
4489}
4490
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004491void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4492{
4493 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4494}
4495
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004496void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4497{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004498 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004499
4500 try
4501 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004502 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004503
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504 if (context)
4505 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004506 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507 }
4508 }
4509 catch(std::bad_alloc&)
4510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512 }
4513}
4514
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004515void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004517 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004518
4519 try
4520 {
4521 if (condition != GL_ALL_COMPLETED_NV)
4522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004523 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004524 }
4525
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004526 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004527
4528 if (context)
4529 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004530 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004531
4532 if (fenceObject == NULL)
4533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004534 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004535 }
4536
4537 fenceObject->setFence(condition);
4538 }
4539 }
4540 catch(std::bad_alloc&)
4541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004543 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004544}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004545
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004546void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004548 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 +00004549
4550 try
4551 {
4552 if (width < 0 || height < 0)
4553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004554 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555 }
4556
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004557 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004558
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004559 if (context)
4560 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004561 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004562 }
4563 }
4564 catch(std::bad_alloc&)
4565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004567 }
4568}
4569
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004570void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004572 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004573 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004574 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004575
4576 try
4577 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004578 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580 }
4581 catch(std::bad_alloc&)
4582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004583 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584 }
4585}
4586
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004587void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004589 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 +00004590 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591
4592 try
4593 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004594 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 }
4598
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004599 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 if (context)
4602 {
4603 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004604
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605 if (!shaderObject)
4606 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004607 if (context->getProgram(shader))
4608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004609 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004610 }
4611 else
4612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004614 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004615 }
4616
4617 shaderObject->setSource(count, string, length);
4618 }
4619 }
4620 catch(std::bad_alloc&)
4621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623 }
4624}
4625
4626void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4627{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004628 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629}
4630
4631void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004633 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 +00004634
4635 try
4636 {
4637 switch (face)
4638 {
4639 case GL_FRONT:
4640 case GL_BACK:
4641 case GL_FRONT_AND_BACK:
4642 break;
4643 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
4646
4647 switch (func)
4648 {
4649 case GL_NEVER:
4650 case GL_ALWAYS:
4651 case GL_LESS:
4652 case GL_LEQUAL:
4653 case GL_EQUAL:
4654 case GL_GEQUAL:
4655 case GL_GREATER:
4656 case GL_NOTEQUAL:
4657 break;
4658 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004659 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660 }
4661
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004662 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004663
4664 if (context)
4665 {
4666 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4667 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004668 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 }
4670
4671 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4672 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004673 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674 }
4675 }
4676 }
4677 catch(std::bad_alloc&)
4678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680 }
4681}
4682
4683void __stdcall glStencilMask(GLuint mask)
4684{
4685 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4686}
4687
4688void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4689{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004690 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004691
4692 try
4693 {
4694 switch (face)
4695 {
4696 case GL_FRONT:
4697 case GL_BACK:
4698 case GL_FRONT_AND_BACK:
4699 break;
4700 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004701 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 }
4703
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004704 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705
4706 if (context)
4707 {
4708 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4709 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004710 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004711 }
4712
4713 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4714 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004715 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 }
4717 }
4718 }
4719 catch(std::bad_alloc&)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722 }
4723}
4724
4725void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4726{
4727 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4728}
4729
4730void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4731{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004732 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 +00004733 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734
4735 try
4736 {
4737 switch (face)
4738 {
4739 case GL_FRONT:
4740 case GL_BACK:
4741 case GL_FRONT_AND_BACK:
4742 break;
4743 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004744 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004745 }
4746
4747 switch (fail)
4748 {
4749 case GL_ZERO:
4750 case GL_KEEP:
4751 case GL_REPLACE:
4752 case GL_INCR:
4753 case GL_DECR:
4754 case GL_INVERT:
4755 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004756 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757 break;
4758 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004759 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760 }
4761
4762 switch (zfail)
4763 {
4764 case GL_ZERO:
4765 case GL_KEEP:
4766 case GL_REPLACE:
4767 case GL_INCR:
4768 case GL_DECR:
4769 case GL_INVERT:
4770 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004771 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 break;
4773 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004774 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 }
4776
4777 switch (zpass)
4778 {
4779 case GL_ZERO:
4780 case GL_KEEP:
4781 case GL_REPLACE:
4782 case GL_INCR:
4783 case GL_DECR:
4784 case GL_INVERT:
4785 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004786 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787 break;
4788 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004789 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 }
4791
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793
4794 if (context)
4795 {
4796 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4797 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004798 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 }
4800
4801 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4802 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004803 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804 }
4805 }
4806 }
4807 catch(std::bad_alloc&)
4808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004809 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810 }
4811}
4812
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004813GLboolean __stdcall glTestFenceNV(GLuint fence)
4814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004815 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004816
4817 try
4818 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004819 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004820
4821 if (context)
4822 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004823 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004824
4825 if (fenceObject == NULL)
4826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004827 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004828 }
4829
Jamie Madillfb9a7402013-07-26 11:55:01 -04004830 if (fenceObject->isFence() != GL_TRUE)
4831 {
4832 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4833 }
4834
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004835 return fenceObject->testFence();
4836 }
4837 }
4838 catch(std::bad_alloc&)
4839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004840 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004841 }
4842
4843 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004844}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004845
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004846void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4847 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004849 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004850 "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 +00004851 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852
4853 try
4854 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856
4857 if (context)
4858 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004859 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004860 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004861 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004862 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004863 return;
4864 }
4865
4866 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004867 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004868 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004869 {
4870 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004871 }
4872
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004873 switch (target)
4874 {
4875 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004876 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004877 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004878 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004879 }
4880 break;
4881 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004882 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004883 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004884 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004886 break;
4887 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4888 {
4889 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004890 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004891 }
4892 break;
4893 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4894 {
4895 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004896 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004897 }
4898 break;
4899 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4900 {
4901 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004902 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004903 }
4904 break;
4905 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4906 {
4907 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004908 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004909 }
4910 break;
4911 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4912 {
4913 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004914 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004915 }
4916 break;
4917 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918 }
4919 }
4920 }
4921 catch(std::bad_alloc&)
4922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924 }
4925}
4926
4927void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4928{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004929 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4930
4931 try
4932 {
4933 gl::Context *context = gl::getNonLostContext();
4934
4935 if (context)
4936 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004937 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004938 {
4939 return;
4940 }
4941
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004942 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004943
Jamie Madillfb8a8302013-07-03 14:24:12 -04004944 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004946 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004947 }
4948
4949 switch (pname)
4950 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004951 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4952 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4953 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4954 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4955 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4956 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4957 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4958 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4959 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004960 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4961 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4962 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4963 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004964
Jamie Madill478fdb22013-07-19 16:36:59 -04004965 case GL_TEXTURE_BASE_LEVEL:
4966 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004967 case GL_TEXTURE_MIN_LOD:
4968 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004969 UNIMPLEMENTED();
4970 break;
4971
Jamie Madill478fdb22013-07-19 16:36:59 -04004972 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004973 }
4974 }
4975 }
4976 catch(std::bad_alloc&)
4977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004979 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004980}
4981
4982void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4983{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004984 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004985}
4986
4987void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4988{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004989 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004990
4991 try
4992 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004993 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994
4995 if (context)
4996 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004997 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004998 {
4999 return;
5000 }
5001
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005002 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005003
Jamie Madillfb8a8302013-07-03 14:24:12 -04005004 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005006 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007 }
5008
5009 switch (pname)
5010 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005011 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5012 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5013 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5014 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5015 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5016 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5017 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5018 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5019 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005020 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5021 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5022 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5023 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005024
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005025 case GL_TEXTURE_BASE_LEVEL:
5026 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005027 case GL_TEXTURE_MIN_LOD:
5028 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005029 UNIMPLEMENTED();
5030 break;
5031
Jamie Madill478fdb22013-07-19 16:36:59 -04005032 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033 }
5034 }
5035 }
5036 catch(std::bad_alloc&)
5037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005039 }
5040}
5041
5042void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5043{
5044 glTexParameteri(target, pname, *params);
5045}
5046
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005047void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5048{
5049 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5050 target, levels, internalformat, width, height);
5051
5052 try
5053 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005054 gl::Context *context = gl::getNonLostContext();
5055
5056 if (context)
5057 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005058 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005059 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005060 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005061 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005062 }
5063
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005064 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005065 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005066 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005067 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005068 }
5069
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005070 switch (target)
5071 {
5072 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005073 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005074 gl::Texture2D *texture2d = context->getTexture2D();
5075 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005076 }
5077 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005078
Geoff Lang01c21d22013-09-24 11:52:16 -04005079 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005080 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005081 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5082 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005083 }
5084 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005085
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005086 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005087 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005088 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005089 }
5090 }
5091 catch(std::bad_alloc&)
5092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005093 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005094 }
5095}
5096
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005097void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5098 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005099{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005100 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005101 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005102 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103 target, level, xoffset, yoffset, width, height, format, type, pixels);
5104
5105 try
5106 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005107 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005108
5109 if (context)
5110 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005111 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005112 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005113 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005114 {
5115 return;
5116 }
5117
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005118 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005119 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005120 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005121 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005122 return;
5123 }
5124
5125 switch (target)
5126 {
5127 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005128 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005129 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005130 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005131 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005132 break;
5133
5134 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5135 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5136 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5137 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5138 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5139 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005140 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005141 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005142 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005143 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005144 break;
5145
5146 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005147 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005148 }
5149 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150 }
5151 catch(std::bad_alloc&)
5152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154 }
5155}
5156
5157void __stdcall glUniform1f(GLint location, GLfloat x)
5158{
5159 glUniform1fv(location, 1, &x);
5160}
5161
5162void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005164 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165
5166 try
5167 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005168 if (count < 0)
5169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005171 }
5172
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005173 if (location == -1)
5174 {
5175 return;
5176 }
5177
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005178 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005179
5180 if (context)
5181 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005182 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005183 if (!programBinary)
5184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005185 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005186 }
5187
5188 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005190 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005191 }
5192 }
5193 }
5194 catch(std::bad_alloc&)
5195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005196 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197 }
5198}
5199
5200void __stdcall glUniform1i(GLint location, GLint x)
5201{
5202 glUniform1iv(location, 1, &x);
5203}
5204
5205void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005207 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208
5209 try
5210 {
5211 if (count < 0)
5212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005213 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214 }
5215
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005216 if (location == -1)
5217 {
5218 return;
5219 }
5220
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222
5223 if (context)
5224 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005226 if (!programBinary)
5227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005228 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005229 }
5230
5231 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005233 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005234 }
5235 }
5236 }
5237 catch(std::bad_alloc&)
5238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005240 }
5241}
5242
5243void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5244{
5245 GLfloat xy[2] = {x, y};
5246
5247 glUniform2fv(location, 1, (GLfloat*)&xy);
5248}
5249
5250void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005252 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253
5254 try
5255 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 if (count < 0)
5257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005260
5261 if (location == -1)
5262 {
5263 return;
5264 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267
5268 if (context)
5269 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005270 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005271 if (!programBinary)
5272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005273 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005274 }
5275
5276 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005278 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005279 }
5280 }
5281 }
5282 catch(std::bad_alloc&)
5283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005285 }
5286}
5287
5288void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5289{
5290 GLint xy[4] = {x, y};
5291
5292 glUniform2iv(location, 1, (GLint*)&xy);
5293}
5294
5295void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005297 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298
5299 try
5300 {
5301 if (count < 0)
5302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 }
5305
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005306 if (location == -1)
5307 {
5308 return;
5309 }
5310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005312
5313 if (context)
5314 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005315 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005316 if (!programBinary)
5317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005318 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005319 }
5320
5321 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005323 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005324 }
5325 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 }
5327 catch(std::bad_alloc&)
5328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330 }
5331}
5332
5333void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5334{
5335 GLfloat xyz[3] = {x, y, z};
5336
5337 glUniform3fv(location, 1, (GLfloat*)&xyz);
5338}
5339
5340void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005342 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005343
5344 try
5345 {
5346 if (count < 0)
5347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005349 }
5350
5351 if (location == -1)
5352 {
5353 return;
5354 }
5355
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005357
5358 if (context)
5359 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005360 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005361 if (!programBinary)
5362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005363 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005364 }
5365
5366 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005368 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005369 }
5370 }
5371 }
5372 catch(std::bad_alloc&)
5373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005374 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005375 }
5376}
5377
5378void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5379{
5380 GLint xyz[3] = {x, y, z};
5381
5382 glUniform3iv(location, 1, (GLint*)&xyz);
5383}
5384
5385void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5386{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005387 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388
5389 try
5390 {
5391 if (count < 0)
5392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394 }
5395
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005396 if (location == -1)
5397 {
5398 return;
5399 }
5400
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005401 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005402
5403 if (context)
5404 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005405 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005406 if (!programBinary)
5407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005409 }
5410
5411 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005414 }
5415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005416 }
5417 catch(std::bad_alloc&)
5418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 }
5421}
5422
5423void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5424{
5425 GLfloat xyzw[4] = {x, y, z, w};
5426
5427 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5428}
5429
5430void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005432 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005433
5434 try
5435 {
5436 if (count < 0)
5437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440
5441 if (location == -1)
5442 {
5443 return;
5444 }
5445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005447
5448 if (context)
5449 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005450 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005451 if (!programBinary)
5452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005453 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005454 }
5455
5456 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005458 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005459 }
5460 }
5461 }
5462 catch(std::bad_alloc&)
5463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465 }
5466}
5467
5468void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5469{
5470 GLint xyzw[4] = {x, y, z, w};
5471
5472 glUniform4iv(location, 1, (GLint*)&xyzw);
5473}
5474
5475void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005477 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478
5479 try
5480 {
5481 if (count < 0)
5482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 }
5485
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005486 if (location == -1)
5487 {
5488 return;
5489 }
5490
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005491 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005492
5493 if (context)
5494 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005495 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005496 if (!programBinary)
5497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005499 }
5500
5501 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005504 }
5505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506 }
5507 catch(std::bad_alloc&)
5508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005509 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005510 }
5511}
5512
5513void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5514{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005515 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005516 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005517
5518 try
5519 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005520 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005522 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005523 }
5524
5525 if (location == -1)
5526 {
5527 return;
5528 }
5529
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005530 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005531
5532 if (context)
5533 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005534 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5535 {
5536 return gl::error(GL_INVALID_VALUE);
5537 }
5538
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005539 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005540 if (!programBinary)
5541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005542 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005543 }
5544
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005545 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005547 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005548 }
5549 }
5550 }
5551 catch(std::bad_alloc&)
5552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005553 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005554 }
5555}
5556
5557void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5558{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005559 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005560 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561
5562 try
5563 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005564 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 }
5568
5569 if (location == -1)
5570 {
5571 return;
5572 }
5573
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005574 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005575
5576 if (context)
5577 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005578 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5579 {
5580 return gl::error(GL_INVALID_VALUE);
5581 }
5582
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005583 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005584 if (!programBinary)
5585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005586 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005587 }
5588
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005589 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592 }
5593 }
5594 }
5595 catch(std::bad_alloc&)
5596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005598 }
5599}
5600
5601void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5602{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005603 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005604 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005605
5606 try
5607 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005608 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
5612
5613 if (location == -1)
5614 {
5615 return;
5616 }
5617
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005618 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005619
5620 if (context)
5621 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005622 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5623 {
5624 return gl::error(GL_INVALID_VALUE);
5625 }
5626
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005627 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005628 if (!programBinary)
5629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005630 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005631 }
5632
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005633 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 }
5637 }
5638 }
5639 catch(std::bad_alloc&)
5640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
5643}
5644
5645void __stdcall glUseProgram(GLuint program)
5646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005647 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005648
5649 try
5650 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005651 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005652
5653 if (context)
5654 {
5655 gl::Program *programObject = context->getProgram(program);
5656
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005657 if (!programObject && program != 0)
5658 {
5659 if (context->getShader(program))
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005662 }
5663 else
5664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005666 }
5667 }
5668
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005669 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672 }
5673
5674 context->useProgram(program);
5675 }
5676 }
5677 catch(std::bad_alloc&)
5678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005680 }
5681}
5682
5683void __stdcall glValidateProgram(GLuint program)
5684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005685 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686
5687 try
5688 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005690
5691 if (context)
5692 {
5693 gl::Program *programObject = context->getProgram(program);
5694
5695 if (!programObject)
5696 {
5697 if (context->getShader(program))
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005700 }
5701 else
5702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005703 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005704 }
5705 }
5706
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005707 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709 }
5710 catch(std::bad_alloc&)
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713 }
5714}
5715
5716void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005718 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719
5720 try
5721 {
5722 if (index >= gl::MAX_VERTEX_ATTRIBS)
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005725 }
5726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005728
5729 if (context)
5730 {
5731 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005732 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005733 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
5735 catch(std::bad_alloc&)
5736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 }
5739}
5740
5741void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005743 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005744
5745 try
5746 {
5747 if (index >= gl::MAX_VERTEX_ATTRIBS)
5748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005750 }
5751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005753
5754 if (context)
5755 {
5756 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005757 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005758 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 }
5760 catch(std::bad_alloc&)
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005763 }
5764}
5765
5766void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005768 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005769
5770 try
5771 {
5772 if (index >= gl::MAX_VERTEX_ATTRIBS)
5773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005775 }
5776
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005777 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005778
5779 if (context)
5780 {
5781 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005782 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005783 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005784 }
5785 catch(std::bad_alloc&)
5786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005788 }
5789}
5790
5791void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005793 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794
5795 try
5796 {
5797 if (index >= gl::MAX_VERTEX_ATTRIBS)
5798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800 }
5801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005803
5804 if (context)
5805 {
5806 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005807 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005808 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809 }
5810 catch(std::bad_alloc&)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 }
5814}
5815
5816void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5817{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005818 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 +00005819
5820 try
5821 {
5822 if (index >= gl::MAX_VERTEX_ATTRIBS)
5823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005824 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825 }
5826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005828
5829 if (context)
5830 {
5831 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005832 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005833 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834 }
5835 catch(std::bad_alloc&)
5836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838 }
5839}
5840
5841void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005843 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005844
5845 try
5846 {
5847 if (index >= gl::MAX_VERTEX_ATTRIBS)
5848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005850 }
5851
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005853
5854 if (context)
5855 {
5856 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005857 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005858 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 }
5860 catch(std::bad_alloc&)
5861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005863 }
5864}
5865
5866void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005868 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 +00005869
5870 try
5871 {
5872 if (index >= gl::MAX_VERTEX_ATTRIBS)
5873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005875 }
5876
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005878
5879 if (context)
5880 {
5881 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005882 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005883 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885 catch(std::bad_alloc&)
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005888 }
5889}
5890
5891void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5892{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005893 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005894
5895 try
5896 {
5897 if (index >= gl::MAX_VERTEX_ATTRIBS)
5898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900 }
5901
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005902 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005903
5904 if (context)
5905 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005906 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005907 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005908 }
5909 catch(std::bad_alloc&)
5910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005911 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912 }
5913}
5914
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005915void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5916{
5917 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5918
5919 try
5920 {
5921 if (index >= gl::MAX_VERTEX_ATTRIBS)
5922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005924 }
5925
5926 gl::Context *context = gl::getNonLostContext();
5927
5928 if (context)
5929 {
5930 context->setVertexAttribDivisor(index, divisor);
5931 }
5932 }
5933 catch(std::bad_alloc&)
5934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005936 }
5937}
5938
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005939void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005941 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005942 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005943 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944
5945 try
5946 {
5947 if (index >= gl::MAX_VERTEX_ATTRIBS)
5948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 }
5951
5952 if (size < 1 || size > 4)
5953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005955 }
5956
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005957 gl::Context *context = gl::getNonLostContext();
5958
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959 switch (type)
5960 {
5961 case GL_BYTE:
5962 case GL_UNSIGNED_BYTE:
5963 case GL_SHORT:
5964 case GL_UNSIGNED_SHORT:
5965 case GL_FIXED:
5966 case GL_FLOAT:
5967 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005968 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005969 case GL_INT:
5970 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005971 case GL_INT_2_10_10_10_REV:
5972 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005973 if (context && context->getClientVersion() < 3)
5974 {
5975 return gl::error(GL_INVALID_ENUM);
5976 }
5977 else
5978 {
5979 break;
5980 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005983 }
5984
5985 if (stride < 0)
5986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005988 }
5989
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005990 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5991 {
5992 return gl::error(GL_INVALID_OPERATION);
5993 }
5994
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995 if (context)
5996 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005997 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5998 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5999 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6000 // and the pointer argument is not NULL.
6001 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6002 {
6003 return gl::error(GL_INVALID_OPERATION);
6004 }
6005
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006006 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6007 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006008 }
6009 }
6010 catch(std::bad_alloc&)
6011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006012 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006013 }
6014}
6015
6016void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6017{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006018 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 +00006019
6020 try
6021 {
6022 if (width < 0 || height < 0)
6023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006024 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006025 }
6026
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006027 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006028
6029 if (context)
6030 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006031 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006032 }
6033 }
6034 catch(std::bad_alloc&)
6035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006036 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037 }
6038}
6039
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006040// OpenGL ES 3.0 functions
6041
6042void __stdcall glReadBuffer(GLenum mode)
6043{
6044 EVENT("(GLenum mode = 0x%X)", mode);
6045
6046 try
6047 {
6048 gl::Context *context = gl::getNonLostContext();
6049
6050 if (context)
6051 {
6052 if (context->getClientVersion() < 3)
6053 {
6054 return gl::error(GL_INVALID_OPERATION);
6055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006056
Jamie Madill54133512013-06-21 09:33:07 -04006057 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006058 UNIMPLEMENTED();
6059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006060 }
6061 catch(std::bad_alloc&)
6062 {
6063 return gl::error(GL_OUT_OF_MEMORY);
6064 }
6065}
6066
6067void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6068{
6069 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6070 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6071
6072 try
6073 {
6074 gl::Context *context = gl::getNonLostContext();
6075
6076 if (context)
6077 {
6078 if (context->getClientVersion() < 3)
6079 {
6080 return gl::error(GL_INVALID_OPERATION);
6081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006082
Jamie Madill54133512013-06-21 09:33:07 -04006083 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006084 UNIMPLEMENTED();
6085 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006086 }
6087 catch(std::bad_alloc&)
6088 {
6089 return gl::error(GL_OUT_OF_MEMORY);
6090 }
6091}
6092
6093void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6094{
6095 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6096 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6097 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6098 target, level, internalformat, width, height, depth, border, format, type, pixels);
6099
6100 try
6101 {
6102 gl::Context *context = gl::getNonLostContext();
6103
6104 if (context)
6105 {
6106 if (context->getClientVersion() < 3)
6107 {
6108 return gl::error(GL_INVALID_OPERATION);
6109 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006110
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006111 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006112 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006113 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006114 {
6115 return;
6116 }
6117
6118 switch(target)
6119 {
6120 case GL_TEXTURE_3D:
6121 {
6122 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006123 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006124 }
6125 break;
6126
6127 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006128 {
6129 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006130 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006131 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006132 break;
6133
6134 default:
6135 return gl::error(GL_INVALID_ENUM);
6136 }
6137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006138 }
6139 catch(std::bad_alloc&)
6140 {
6141 return gl::error(GL_OUT_OF_MEMORY);
6142 }
6143}
6144
6145void __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)
6146{
6147 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6148 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6149 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6150 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6151
6152 try
6153 {
6154 gl::Context *context = gl::getNonLostContext();
6155
6156 if (context)
6157 {
6158 if (context->getClientVersion() < 3)
6159 {
6160 return gl::error(GL_INVALID_OPERATION);
6161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006162
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006163 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006164 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006165 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006166 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006167 {
6168 return;
6169 }
6170
6171 switch(target)
6172 {
6173 case GL_TEXTURE_3D:
6174 {
6175 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006176 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 +00006177 }
6178 break;
6179
6180 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006181 {
6182 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006183 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 +00006184 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006185 break;
6186
6187 default:
6188 return gl::error(GL_INVALID_ENUM);
6189 }
6190 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006191 }
6192 catch(std::bad_alloc&)
6193 {
6194 return gl::error(GL_OUT_OF_MEMORY);
6195 }
6196}
6197
6198void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6199{
6200 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6201 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6202 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6203
6204 try
6205 {
6206 gl::Context *context = gl::getNonLostContext();
6207
6208 if (context)
6209 {
6210 if (context->getClientVersion() < 3)
6211 {
6212 return gl::error(GL_INVALID_OPERATION);
6213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006214
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006215 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006216 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006217 {
6218 return;
6219 }
6220
6221 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6222 gl::Texture *texture = NULL;
6223 switch (target)
6224 {
6225 case GL_TEXTURE_3D:
6226 texture = context->getTexture3D();
6227 break;
6228
6229 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006230 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006231 break;
6232
6233 default:
6234 return gl::error(GL_INVALID_ENUM);
6235 }
6236
6237 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006239 }
6240 catch(std::bad_alloc&)
6241 {
6242 return gl::error(GL_OUT_OF_MEMORY);
6243 }
6244}
6245
6246void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6247{
Geoff Langeef52cc2013-10-16 15:07:39 -04006248 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 +00006249 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6250 "const GLvoid* data = 0x%0.8p)",
6251 target, level, internalformat, width, height, depth, border, imageSize, data);
6252
6253 try
6254 {
6255 gl::Context *context = gl::getNonLostContext();
6256
6257 if (context)
6258 {
6259 if (context->getClientVersion() < 3)
6260 {
6261 return gl::error(GL_INVALID_OPERATION);
6262 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006263
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006264 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 +00006265 {
6266 return gl::error(GL_INVALID_VALUE);
6267 }
6268
6269 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006270 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006271 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006272 {
6273 return;
6274 }
6275
6276 switch(target)
6277 {
6278 case GL_TEXTURE_3D:
6279 {
6280 gl::Texture3D *texture = context->getTexture3D();
6281 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6282 }
6283 break;
6284
6285 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006286 {
6287 gl::Texture2DArray *texture = context->getTexture2DArray();
6288 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6289 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006290 break;
6291
6292 default:
6293 return gl::error(GL_INVALID_ENUM);
6294 }
6295 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006296 }
6297 catch(std::bad_alloc&)
6298 {
6299 return gl::error(GL_OUT_OF_MEMORY);
6300 }
6301}
6302
6303void __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)
6304{
6305 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6306 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6307 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6308 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6309
6310 try
6311 {
6312 gl::Context *context = gl::getNonLostContext();
6313
6314 if (context)
6315 {
6316 if (context->getClientVersion() < 3)
6317 {
6318 return gl::error(GL_INVALID_OPERATION);
6319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006320
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006321 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 +00006322 {
6323 return gl::error(GL_INVALID_VALUE);
6324 }
6325
6326 if (!data)
6327 {
6328 return gl::error(GL_INVALID_VALUE);
6329 }
6330
6331 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006332 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006333 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006334 {
6335 return;
6336 }
6337
6338 switch(target)
6339 {
6340 case GL_TEXTURE_3D:
6341 {
6342 gl::Texture3D *texture = context->getTexture3D();
6343 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6344 format, imageSize, data);
6345 }
6346 break;
6347
6348 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006349 {
6350 gl::Texture2DArray *texture = context->getTexture2DArray();
6351 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6352 format, imageSize, data);
6353 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006354 break;
6355
6356 default:
6357 return gl::error(GL_INVALID_ENUM);
6358 }
6359 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006360 }
6361 catch(std::bad_alloc&)
6362 {
6363 return gl::error(GL_OUT_OF_MEMORY);
6364 }
6365}
6366
6367void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6368{
6369 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6370
6371 try
6372 {
6373 gl::Context *context = gl::getNonLostContext();
6374
6375 if (context)
6376 {
6377 if (context->getClientVersion() < 3)
6378 {
6379 return gl::error(GL_INVALID_OPERATION);
6380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006381
Geoff Lang37dde692014-01-31 16:34:54 -05006382 if (n < 0)
6383 {
6384 return gl::error(GL_INVALID_VALUE);
6385 }
6386
6387 for (GLsizei i = 0; i < n; i++)
6388 {
6389 ids[i] = context->createQuery();
6390 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006391 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006392 }
6393 catch(std::bad_alloc&)
6394 {
6395 return gl::error(GL_OUT_OF_MEMORY);
6396 }
6397}
6398
6399void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6400{
6401 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6402
6403 try
6404 {
6405 gl::Context *context = gl::getNonLostContext();
6406
6407 if (context)
6408 {
6409 if (context->getClientVersion() < 3)
6410 {
6411 return gl::error(GL_INVALID_OPERATION);
6412 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006413
Geoff Lang37dde692014-01-31 16:34:54 -05006414 if (n < 0)
6415 {
6416 return gl::error(GL_INVALID_VALUE);
6417 }
6418
6419 for (GLsizei i = 0; i < n; i++)
6420 {
6421 context->deleteQuery(ids[i]);
6422 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006424 }
6425 catch(std::bad_alloc&)
6426 {
6427 return gl::error(GL_OUT_OF_MEMORY);
6428 }
6429}
6430
6431GLboolean __stdcall glIsQuery(GLuint id)
6432{
6433 EVENT("(GLuint id = %u)", id);
6434
6435 try
6436 {
6437 gl::Context *context = gl::getNonLostContext();
6438
6439 if (context)
6440 {
6441 if (context->getClientVersion() < 3)
6442 {
6443 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6444 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006445
Geoff Lang37dde692014-01-31 16:34:54 -05006446 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006448 }
6449 catch(std::bad_alloc&)
6450 {
6451 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6452 }
6453
6454 return GL_FALSE;
6455}
6456
6457void __stdcall glBeginQuery(GLenum target, GLuint id)
6458{
6459 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6460
6461 try
6462 {
6463 gl::Context *context = gl::getNonLostContext();
6464
6465 if (context)
6466 {
6467 if (context->getClientVersion() < 3)
6468 {
6469 return gl::error(GL_INVALID_OPERATION);
6470 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006471
Geoff Lang37dde692014-01-31 16:34:54 -05006472 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006473 {
Geoff Lang37dde692014-01-31 16:34:54 -05006474 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006475 }
6476
6477 if (id == 0)
6478 {
6479 return gl::error(GL_INVALID_OPERATION);
6480 }
6481
Geoff Lang37dde692014-01-31 16:34:54 -05006482 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006483 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006484 }
6485 catch(std::bad_alloc&)
6486 {
6487 return gl::error(GL_OUT_OF_MEMORY);
6488 }
6489}
6490
6491void __stdcall glEndQuery(GLenum target)
6492{
6493 EVENT("(GLenum target = 0x%X)", target);
6494
6495 try
6496 {
6497 gl::Context *context = gl::getNonLostContext();
6498
6499 if (context)
6500 {
6501 if (context->getClientVersion() < 3)
6502 {
6503 return gl::error(GL_INVALID_OPERATION);
6504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006505
Geoff Lang37dde692014-01-31 16:34:54 -05006506 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006507 {
Geoff Lang37dde692014-01-31 16:34:54 -05006508 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006509 }
Geoff Lang37dde692014-01-31 16:34:54 -05006510
6511 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006512 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006513 }
6514 catch(std::bad_alloc&)
6515 {
6516 return gl::error(GL_OUT_OF_MEMORY);
6517 }
6518}
6519
6520void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6521{
6522 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6523
6524 try
6525 {
6526 gl::Context *context = gl::getNonLostContext();
6527
6528 if (context)
6529 {
6530 if (context->getClientVersion() < 3)
6531 {
6532 return gl::error(GL_INVALID_OPERATION);
6533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006534
Geoff Lang37dde692014-01-31 16:34:54 -05006535 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006536 {
Geoff Lang37dde692014-01-31 16:34:54 -05006537 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006538 }
Geoff Lang37dde692014-01-31 16:34:54 -05006539
6540 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006541 {
Geoff Lang37dde692014-01-31 16:34:54 -05006542 case GL_CURRENT_QUERY:
6543 params[0] = context->getActiveQuery(target);
6544 break;
6545
6546 default:
6547 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006548 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006550 }
6551 catch(std::bad_alloc&)
6552 {
6553 return gl::error(GL_OUT_OF_MEMORY);
6554 }
6555}
6556
6557void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6558{
6559 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6560
6561 try
6562 {
6563 gl::Context *context = gl::getNonLostContext();
6564
6565 if (context)
6566 {
6567 if (context->getClientVersion() < 3)
6568 {
6569 return gl::error(GL_INVALID_OPERATION);
6570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006571
Geoff Lang37dde692014-01-31 16:34:54 -05006572 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6573
6574 if (!queryObject)
6575 {
6576 return gl::error(GL_INVALID_OPERATION);
6577 }
6578
6579 if (context->getActiveQuery(queryObject->getType()) == id)
6580 {
6581 return gl::error(GL_INVALID_OPERATION);
6582 }
6583
6584 switch(pname)
6585 {
6586 case GL_QUERY_RESULT:
6587 params[0] = queryObject->getResult();
6588 break;
6589 case GL_QUERY_RESULT_AVAILABLE:
6590 params[0] = queryObject->isResultAvailable();
6591 break;
6592 default:
6593 return gl::error(GL_INVALID_ENUM);
6594 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006595 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006596 }
6597 catch(std::bad_alloc&)
6598 {
6599 return gl::error(GL_OUT_OF_MEMORY);
6600 }
6601}
6602
6603GLboolean __stdcall glUnmapBuffer(GLenum target)
6604{
6605 EVENT("(GLenum target = 0x%X)", target);
6606
6607 try
6608 {
6609 gl::Context *context = gl::getNonLostContext();
6610
6611 if (context)
6612 {
6613 if (context->getClientVersion() < 3)
6614 {
6615 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006617
Jamie Madill7a5f7382014-03-05 15:01:24 -05006618 if (!gl::ValidBufferTarget(context, target))
6619 {
6620 return gl::error(GL_INVALID_ENUM, GL_FALSE);
6621 }
6622
6623 gl::Buffer *buffer = context->getTargetBuffer(target);
6624
6625 if (buffer == NULL || !buffer->mapped())
6626 {
6627 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6628 }
6629
6630 // TODO: detect if we had corruption. if so, throw an error and return false.
6631
6632 buffer->unmap();
6633
6634 return GL_TRUE;
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, GL_FALSE);
6640 }
6641
6642 return GL_FALSE;
6643}
6644
6645void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6646{
6647 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6648
6649 try
6650 {
6651 gl::Context *context = gl::getNonLostContext();
6652
6653 if (context)
6654 {
6655 if (context->getClientVersion() < 3)
6656 {
6657 return gl::error(GL_INVALID_OPERATION);
6658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006659
Jamie Madill54133512013-06-21 09:33:07 -04006660 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006661 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006663 }
6664 catch(std::bad_alloc&)
6665 {
6666 return gl::error(GL_OUT_OF_MEMORY);
6667 }
6668}
6669
6670void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6671{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006672 try
6673 {
6674 gl::Context *context = gl::getNonLostContext();
6675
6676 if (context)
6677 {
6678 if (context->getClientVersion() < 3)
6679 {
6680 return gl::error(GL_INVALID_OPERATION);
6681 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006682
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006683 glDrawBuffersEXT(n, bufs);
6684 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006685 }
6686 catch(std::bad_alloc&)
6687 {
6688 return gl::error(GL_OUT_OF_MEMORY);
6689 }
6690}
6691
6692void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6693{
6694 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6695 location, count, transpose, value);
6696
6697 try
6698 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006699 if (count < 0)
6700 {
6701 return gl::error(GL_INVALID_VALUE);
6702 }
6703
6704 if (location == -1)
6705 {
6706 return;
6707 }
6708
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006709 gl::Context *context = gl::getNonLostContext();
6710
6711 if (context)
6712 {
6713 if (context->getClientVersion() < 3)
6714 {
6715 return gl::error(GL_INVALID_OPERATION);
6716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006717
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006718 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6719 if (!programBinary)
6720 {
6721 return gl::error(GL_INVALID_OPERATION);
6722 }
6723
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006724 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006725 {
6726 return gl::error(GL_INVALID_OPERATION);
6727 }
6728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006729 }
6730 catch(std::bad_alloc&)
6731 {
6732 return gl::error(GL_OUT_OF_MEMORY);
6733 }
6734}
6735
6736void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6737{
6738 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6739 location, count, transpose, value);
6740
6741 try
6742 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006743 if (count < 0)
6744 {
6745 return gl::error(GL_INVALID_VALUE);
6746 }
6747
6748 if (location == -1)
6749 {
6750 return;
6751 }
6752
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006753 gl::Context *context = gl::getNonLostContext();
6754
6755 if (context)
6756 {
6757 if (context->getClientVersion() < 3)
6758 {
6759 return gl::error(GL_INVALID_OPERATION);
6760 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006761
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006762 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6763 if (!programBinary)
6764 {
6765 return gl::error(GL_INVALID_OPERATION);
6766 }
6767
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006768 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006769 {
6770 return gl::error(GL_INVALID_OPERATION);
6771 }
6772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006773 }
6774 catch(std::bad_alloc&)
6775 {
6776 return gl::error(GL_OUT_OF_MEMORY);
6777 }
6778}
6779
6780void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6781{
6782 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6783 location, count, transpose, value);
6784
6785 try
6786 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006787 if (count < 0)
6788 {
6789 return gl::error(GL_INVALID_VALUE);
6790 }
6791
6792 if (location == -1)
6793 {
6794 return;
6795 }
6796
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006797 gl::Context *context = gl::getNonLostContext();
6798
6799 if (context)
6800 {
6801 if (context->getClientVersion() < 3)
6802 {
6803 return gl::error(GL_INVALID_OPERATION);
6804 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006805
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006806 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6807 if (!programBinary)
6808 {
6809 return gl::error(GL_INVALID_OPERATION);
6810 }
6811
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006812 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006813 {
6814 return gl::error(GL_INVALID_OPERATION);
6815 }
6816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006817 }
6818 catch(std::bad_alloc&)
6819 {
6820 return gl::error(GL_OUT_OF_MEMORY);
6821 }
6822}
6823
6824void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6825{
6826 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6827 location, count, transpose, value);
6828
6829 try
6830 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006831 if (count < 0)
6832 {
6833 return gl::error(GL_INVALID_VALUE);
6834 }
6835
6836 if (location == -1)
6837 {
6838 return;
6839 }
6840
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006841 gl::Context *context = gl::getNonLostContext();
6842
6843 if (context)
6844 {
6845 if (context->getClientVersion() < 3)
6846 {
6847 return gl::error(GL_INVALID_OPERATION);
6848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006849
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006850 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6851 if (!programBinary)
6852 {
6853 return gl::error(GL_INVALID_OPERATION);
6854 }
6855
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006856 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006857 {
6858 return gl::error(GL_INVALID_OPERATION);
6859 }
6860 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006861 }
6862 catch(std::bad_alloc&)
6863 {
6864 return gl::error(GL_OUT_OF_MEMORY);
6865 }
6866}
6867
6868void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6869{
6870 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6871 location, count, transpose, value);
6872
6873 try
6874 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006875 if (count < 0)
6876 {
6877 return gl::error(GL_INVALID_VALUE);
6878 }
6879
6880 if (location == -1)
6881 {
6882 return;
6883 }
6884
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006885 gl::Context *context = gl::getNonLostContext();
6886
6887 if (context)
6888 {
6889 if (context->getClientVersion() < 3)
6890 {
6891 return gl::error(GL_INVALID_OPERATION);
6892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006893
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006894 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6895 if (!programBinary)
6896 {
6897 return gl::error(GL_INVALID_OPERATION);
6898 }
6899
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006900 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006901 {
6902 return gl::error(GL_INVALID_OPERATION);
6903 }
6904 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006905 }
6906 catch(std::bad_alloc&)
6907 {
6908 return gl::error(GL_OUT_OF_MEMORY);
6909 }
6910}
6911
6912void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6913{
6914 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6915 location, count, transpose, value);
6916
6917 try
6918 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006919 if (count < 0)
6920 {
6921 return gl::error(GL_INVALID_VALUE);
6922 }
6923
6924 if (location == -1)
6925 {
6926 return;
6927 }
6928
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006929 gl::Context *context = gl::getNonLostContext();
6930
6931 if (context)
6932 {
6933 if (context->getClientVersion() < 3)
6934 {
6935 return gl::error(GL_INVALID_OPERATION);
6936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006937
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006938 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6939 if (!programBinary)
6940 {
6941 return gl::error(GL_INVALID_OPERATION);
6942 }
6943
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006944 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006945 {
6946 return gl::error(GL_INVALID_OPERATION);
6947 }
6948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006949 }
6950 catch(std::bad_alloc&)
6951 {
6952 return gl::error(GL_OUT_OF_MEMORY);
6953 }
6954}
6955
6956void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6957{
6958 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6959 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6960 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6961
6962 try
6963 {
6964 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006965 if (context)
6966 {
6967 if (context->getClientVersion() < 3)
6968 {
6969 return gl::error(GL_INVALID_OPERATION);
6970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006971
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006972 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006973 dstX0, dstY0, dstX1, dstY1, mask, filter,
6974 false))
6975 {
6976 return;
6977 }
6978
6979 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6980 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006982 }
6983 catch(std::bad_alloc&)
6984 {
6985 return gl::error(GL_OUT_OF_MEMORY);
6986 }
6987}
6988
6989void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6990{
6991 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6992 target, samples, internalformat, width, height);
6993
6994 try
6995 {
6996 gl::Context *context = gl::getNonLostContext();
6997
6998 if (context)
6999 {
7000 if (context->getClientVersion() < 3)
7001 {
7002 return gl::error(GL_INVALID_OPERATION);
7003 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007004
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007005 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007006 width, height, false))
7007 {
7008 return;
7009 }
7010
7011 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007012 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007013 }
7014 catch(std::bad_alloc&)
7015 {
7016 return gl::error(GL_OUT_OF_MEMORY);
7017 }
7018}
7019
7020void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7021{
7022 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7023 target, attachment, texture, level, layer);
7024
7025 try
7026 {
7027 gl::Context *context = gl::getNonLostContext();
7028
7029 if (context)
7030 {
7031 if (context->getClientVersion() < 3)
7032 {
7033 return gl::error(GL_INVALID_OPERATION);
7034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007035
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007036 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007037 {
7038 return;
7039 }
7040
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007041 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7042 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007043
7044 gl::Texture *textureObject = context->getTexture(texture);
7045 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7046
7047 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7048 {
7049 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7050 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7051 }
7052 else
7053 {
7054 switch (attachment)
7055 {
7056 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7057 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7058 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7059 }
7060 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007062 }
7063 catch(std::bad_alloc&)
7064 {
7065 return gl::error(GL_OUT_OF_MEMORY);
7066 }
7067}
7068
7069GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7070{
7071 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7072 target, offset, length, access);
7073
7074 try
7075 {
7076 gl::Context *context = gl::getNonLostContext();
7077
7078 if (context)
7079 {
7080 if (context->getClientVersion() < 3)
7081 {
7082 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007084
Jamie Madill7a5f7382014-03-05 15:01:24 -05007085 if (!gl::ValidBufferTarget(context, target))
7086 {
7087 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
7088 }
7089
7090 if (offset < 0 || length < 0)
7091 {
7092 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7093 }
7094
7095 gl::Buffer *buffer = context->getTargetBuffer(target);
7096
7097 if (buffer == NULL)
7098 {
7099 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7100 }
7101
7102 // Check for buffer overflow
7103 size_t offsetSize = static_cast<size_t>(offset);
7104 size_t lengthSize = static_cast<size_t>(length);
7105
7106 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7107 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
7108 {
7109 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7110 }
7111
7112 // Check for invalid bits in the mask
7113 GLbitfield allAccessBits = GL_MAP_READ_BIT |
7114 GL_MAP_WRITE_BIT |
7115 GL_MAP_INVALIDATE_RANGE_BIT |
7116 GL_MAP_INVALIDATE_BUFFER_BIT |
7117 GL_MAP_FLUSH_EXPLICIT_BIT |
7118 GL_MAP_UNSYNCHRONIZED_BIT;
7119
7120 if (access & ~(allAccessBits))
7121 {
7122 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
7123 }
7124
7125 if (length == 0 || buffer->mapped())
7126 {
7127 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7128 }
7129
7130 // Check for invalid bit combinations
7131 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
7132 {
7133 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7134 }
7135
7136 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
7137 GL_MAP_INVALIDATE_BUFFER_BIT |
7138 GL_MAP_UNSYNCHRONIZED_BIT;
7139
7140 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
7141 {
7142 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7143 }
7144
7145 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
7146 {
7147 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7148 }
7149
7150 return buffer->mapRange(offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007151 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007152 }
7153 catch(std::bad_alloc&)
7154 {
7155 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7156 }
7157
7158 return NULL;
7159}
7160
7161void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7162{
7163 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7164
7165 try
7166 {
7167 gl::Context *context = gl::getNonLostContext();
7168
7169 if (context)
7170 {
7171 if (context->getClientVersion() < 3)
7172 {
7173 return gl::error(GL_INVALID_OPERATION);
7174 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007175
Jamie Madill7a5f7382014-03-05 15:01:24 -05007176 if (offset < 0 || length < 0)
7177 {
7178 return gl::error(GL_INVALID_VALUE);
7179 }
7180
7181 if (!gl::ValidBufferTarget(context, target))
7182 {
7183 return gl::error(GL_INVALID_ENUM);
7184 }
7185
7186 gl::Buffer *buffer = context->getTargetBuffer(target);
7187
7188 if (buffer == NULL)
7189 {
7190 return gl::error(GL_INVALID_OPERATION);
7191 }
7192
7193 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
7194 {
7195 return gl::error(GL_INVALID_OPERATION);
7196 }
7197
7198 // Check for buffer overflow
7199 size_t offsetSize = static_cast<size_t>(offset);
7200 size_t lengthSize = static_cast<size_t>(length);
7201
7202 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
7203 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
7204 {
7205 return gl::error(GL_INVALID_VALUE);
7206 }
7207
7208 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007209 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007210 }
7211 catch(std::bad_alloc&)
7212 {
7213 return gl::error(GL_OUT_OF_MEMORY);
7214 }
7215}
7216
7217void __stdcall glBindVertexArray(GLuint array)
7218{
7219 EVENT("(GLuint array = %u)", array);
7220
7221 try
7222 {
7223 gl::Context *context = gl::getNonLostContext();
7224
7225 if (context)
7226 {
7227 if (context->getClientVersion() < 3)
7228 {
7229 return gl::error(GL_INVALID_OPERATION);
7230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007231
Jamie Madilld1028542013-07-02 11:57:04 -04007232 gl::VertexArray *vao = context->getVertexArray(array);
7233
7234 if (!vao)
7235 {
7236 // The default VAO should always exist
7237 ASSERT(array != 0);
7238 return gl::error(GL_INVALID_OPERATION);
7239 }
7240
7241 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007243 }
7244 catch(std::bad_alloc&)
7245 {
7246 return gl::error(GL_OUT_OF_MEMORY);
7247 }
7248}
7249
7250void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7251{
7252 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7253
7254 try
7255 {
7256 gl::Context *context = gl::getNonLostContext();
7257
7258 if (context)
7259 {
7260 if (context->getClientVersion() < 3)
7261 {
7262 return gl::error(GL_INVALID_OPERATION);
7263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007264
Jamie Madilld1028542013-07-02 11:57:04 -04007265 if (n < 0)
7266 {
7267 return gl::error(GL_INVALID_VALUE);
7268 }
7269
7270 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7271 {
7272 if (arrays[arrayIndex] != 0)
7273 {
7274 context->deleteVertexArray(arrays[arrayIndex]);
7275 }
7276 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007278 }
7279 catch(std::bad_alloc&)
7280 {
7281 return gl::error(GL_OUT_OF_MEMORY);
7282 }
7283}
7284
7285void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7286{
7287 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7288
7289 try
7290 {
7291 gl::Context *context = gl::getNonLostContext();
7292
7293 if (context)
7294 {
7295 if (context->getClientVersion() < 3)
7296 {
7297 return gl::error(GL_INVALID_OPERATION);
7298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007299
Jamie Madilld1028542013-07-02 11:57:04 -04007300 if (n < 0)
7301 {
7302 return gl::error(GL_INVALID_VALUE);
7303 }
7304
7305 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7306 {
7307 arrays[arrayIndex] = context->createVertexArray();
7308 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007310 }
7311 catch(std::bad_alloc&)
7312 {
7313 return gl::error(GL_OUT_OF_MEMORY);
7314 }
7315}
7316
7317GLboolean __stdcall glIsVertexArray(GLuint array)
7318{
7319 EVENT("(GLuint array = %u)", array);
7320
7321 try
7322 {
7323 gl::Context *context = gl::getNonLostContext();
7324
7325 if (context)
7326 {
7327 if (context->getClientVersion() < 3)
7328 {
7329 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7330 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007331
Jamie Madilld1028542013-07-02 11:57:04 -04007332 if (array == 0)
7333 {
7334 return GL_FALSE;
7335 }
7336
7337 gl::VertexArray *vao = context->getVertexArray(array);
7338
7339 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007341 }
7342 catch(std::bad_alloc&)
7343 {
7344 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7345 }
7346
7347 return GL_FALSE;
7348}
7349
7350void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7351{
7352 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7353 target, index, data);
7354
7355 try
7356 {
7357 gl::Context *context = gl::getNonLostContext();
7358
7359 if (context)
7360 {
7361 if (context->getClientVersion() < 3)
7362 {
7363 return gl::error(GL_INVALID_OPERATION);
7364 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007365
Shannon Woods15934d52013-08-19 14:28:49 -04007366 switch (target)
7367 {
7368 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7369 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7370 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7371 if (index >= context->getMaxTransformFeedbackBufferBindings())
7372 return gl::error(GL_INVALID_VALUE);
7373 break;
7374 case GL_UNIFORM_BUFFER_START:
7375 case GL_UNIFORM_BUFFER_SIZE:
7376 case GL_UNIFORM_BUFFER_BINDING:
7377 if (index >= context->getMaximumCombinedUniformBufferBindings())
7378 return gl::error(GL_INVALID_VALUE);
7379 break;
7380 default:
7381 return gl::error(GL_INVALID_ENUM);
7382 }
7383
7384 if (!(context->getIndexedIntegerv(target, index, data)))
7385 {
7386 GLenum nativeType;
7387 unsigned int numParams = 0;
7388 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7389 return gl::error(GL_INVALID_ENUM);
7390
7391 if (numParams == 0)
7392 return; // it is known that pname is valid, but there are no parameters to return
7393
7394 if (nativeType == GL_INT_64_ANGLEX)
7395 {
7396 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7397 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7398 GLint64 *int64Params = new GLint64[numParams];
7399
7400 context->getIndexedInteger64v(target, index, int64Params);
7401
7402 for (unsigned int i = 0; i < numParams; ++i)
7403 {
7404 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7405 data[i] = static_cast<GLint>(clampedValue);
7406 }
7407
7408 delete [] int64Params;
7409 }
7410 else
7411 {
7412 UNREACHABLE();
7413 }
7414 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007416 }
7417 catch(std::bad_alloc&)
7418 {
7419 return gl::error(GL_OUT_OF_MEMORY);
7420 }
7421}
7422
7423void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7424{
7425 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7426
7427 try
7428 {
7429 gl::Context *context = gl::getNonLostContext();
7430
7431 if (context)
7432 {
7433 if (context->getClientVersion() < 3)
7434 {
7435 return gl::error(GL_INVALID_OPERATION);
7436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007437
Geoff Langc8058452014-02-03 12:04:11 -05007438 switch (primitiveMode)
7439 {
7440 case GL_TRIANGLES:
7441 case GL_LINES:
7442 case GL_POINTS:
7443 break;
7444 default:
7445 return gl::error(GL_INVALID_ENUM);
7446 }
7447
7448 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7449 ASSERT(transformFeedback != NULL);
7450
7451 if (transformFeedback->isStarted())
7452 {
7453 return gl::error(GL_INVALID_OPERATION);
7454 }
7455
7456 if (transformFeedback->isPaused())
7457 {
7458 transformFeedback->resume();
7459 }
7460 else
7461 {
7462 transformFeedback->start(primitiveMode);
7463 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007464 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007465 }
7466 catch(std::bad_alloc&)
7467 {
7468 return gl::error(GL_OUT_OF_MEMORY);
7469 }
7470}
7471
7472void __stdcall glEndTransformFeedback(void)
7473{
7474 EVENT("(void)");
7475
7476 try
7477 {
7478 gl::Context *context = gl::getNonLostContext();
7479
7480 if (context)
7481 {
7482 if (context->getClientVersion() < 3)
7483 {
7484 return gl::error(GL_INVALID_OPERATION);
7485 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007486
Geoff Langc8058452014-02-03 12:04:11 -05007487 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7488 ASSERT(transformFeedback != NULL);
7489
7490 if (!transformFeedback->isStarted())
7491 {
7492 return gl::error(GL_INVALID_OPERATION);
7493 }
7494
7495 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007496 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007497 }
7498 catch(std::bad_alloc&)
7499 {
7500 return gl::error(GL_OUT_OF_MEMORY);
7501 }
7502}
7503
7504void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7505{
7506 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7507 target, index, buffer, offset, size);
7508
7509 try
7510 {
7511 gl::Context *context = gl::getNonLostContext();
7512
7513 if (context)
7514 {
7515 if (context->getClientVersion() < 3)
7516 {
7517 return gl::error(GL_INVALID_OPERATION);
7518 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007519
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007520 switch (target)
7521 {
7522 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007523 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007524 {
7525 return gl::error(GL_INVALID_VALUE);
7526 }
7527 break;
7528
7529 case GL_UNIFORM_BUFFER:
7530 if (index >= context->getMaximumCombinedUniformBufferBindings())
7531 {
7532 return gl::error(GL_INVALID_VALUE);
7533 }
7534 break;
7535
7536 default:
7537 return gl::error(GL_INVALID_ENUM);
7538 }
7539
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007540 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007541 {
7542 return gl::error(GL_INVALID_VALUE);
7543 }
7544
7545 switch (target)
7546 {
7547 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007548
7549 // size and offset must be a multiple of 4
7550 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7551 {
7552 return gl::error(GL_INVALID_VALUE);
7553 }
7554
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007555 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7556 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007557 break;
7558
7559 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007560
7561 // it is an error to bind an offset not a multiple of the alignment
7562 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7563 {
7564 return gl::error(GL_INVALID_VALUE);
7565 }
7566
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007567 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7568 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007569 break;
7570
7571 default:
7572 UNREACHABLE();
7573 }
7574 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007575 }
7576 catch(std::bad_alloc&)
7577 {
7578 return gl::error(GL_OUT_OF_MEMORY);
7579 }
7580}
7581
7582void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7583{
7584 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7585 target, index, buffer);
7586
7587 try
7588 {
7589 gl::Context *context = gl::getNonLostContext();
7590
7591 if (context)
7592 {
7593 if (context->getClientVersion() < 3)
7594 {
7595 return gl::error(GL_INVALID_OPERATION);
7596 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007597
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007598 switch (target)
7599 {
7600 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007601 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007602 {
7603 return gl::error(GL_INVALID_VALUE);
7604 }
7605 break;
7606
7607 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007608 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007609 {
7610 return gl::error(GL_INVALID_VALUE);
7611 }
7612 break;
7613
7614 default:
7615 return gl::error(GL_INVALID_ENUM);
7616 }
7617
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007618 switch (target)
7619 {
7620 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007621 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007622 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007623 break;
7624
7625 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007626 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007627 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007628 break;
7629
7630 default:
7631 UNREACHABLE();
7632 }
7633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007634 }
7635 catch(std::bad_alloc&)
7636 {
7637 return gl::error(GL_OUT_OF_MEMORY);
7638 }
7639}
7640
7641void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7642{
7643 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7644 program, count, varyings, bufferMode);
7645
7646 try
7647 {
7648 gl::Context *context = gl::getNonLostContext();
7649
7650 if (context)
7651 {
7652 if (context->getClientVersion() < 3)
7653 {
7654 return gl::error(GL_INVALID_OPERATION);
7655 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007656
Jamie Madill54133512013-06-21 09:33:07 -04007657 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007658 UNIMPLEMENTED();
7659 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007660 }
7661 catch(std::bad_alloc&)
7662 {
7663 return gl::error(GL_OUT_OF_MEMORY);
7664 }
7665}
7666
7667void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7668{
7669 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7670 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7671 program, index, bufSize, length, size, type, name);
7672
7673 try
7674 {
7675 gl::Context *context = gl::getNonLostContext();
7676
7677 if (context)
7678 {
7679 if (context->getClientVersion() < 3)
7680 {
7681 return gl::error(GL_INVALID_OPERATION);
7682 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007683
Jamie Madill54133512013-06-21 09:33:07 -04007684 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007685 UNIMPLEMENTED();
7686 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007687 }
7688 catch(std::bad_alloc&)
7689 {
7690 return gl::error(GL_OUT_OF_MEMORY);
7691 }
7692}
7693
7694void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7695{
7696 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7697 index, size, type, stride, pointer);
7698
7699 try
7700 {
7701 gl::Context *context = gl::getNonLostContext();
7702
7703 if (context)
7704 {
7705 if (context->getClientVersion() < 3)
7706 {
7707 return gl::error(GL_INVALID_OPERATION);
7708 }
7709 }
7710
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007711 if (index >= gl::MAX_VERTEX_ATTRIBS)
7712 {
7713 return gl::error(GL_INVALID_VALUE);
7714 }
7715
7716 if (size < 1 || size > 4)
7717 {
7718 return gl::error(GL_INVALID_VALUE);
7719 }
7720
7721 switch (type)
7722 {
7723 case GL_BYTE:
7724 case GL_UNSIGNED_BYTE:
7725 case GL_SHORT:
7726 case GL_UNSIGNED_SHORT:
7727 case GL_INT:
7728 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007729 case GL_INT_2_10_10_10_REV:
7730 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007731 break;
7732 default:
7733 return gl::error(GL_INVALID_ENUM);
7734 }
7735
7736 if (stride < 0)
7737 {
7738 return gl::error(GL_INVALID_VALUE);
7739 }
7740
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007741 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7742 {
7743 return gl::error(GL_INVALID_OPERATION);
7744 }
7745
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007746 if (context)
7747 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007748 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7749 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7750 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7751 // and the pointer argument is not NULL.
7752 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7753 {
7754 return gl::error(GL_INVALID_OPERATION);
7755 }
7756
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007757 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7758 stride, pointer);
7759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007760 }
7761 catch(std::bad_alloc&)
7762 {
7763 return gl::error(GL_OUT_OF_MEMORY);
7764 }
7765}
7766
7767void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7768{
7769 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7770 index, pname, params);
7771
7772 try
7773 {
7774 gl::Context *context = gl::getNonLostContext();
7775
7776 if (context)
7777 {
7778 if (context->getClientVersion() < 3)
7779 {
7780 return gl::error(GL_INVALID_OPERATION);
7781 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007782
Jamie Madilla7d05862013-07-02 11:57:06 -04007783 if (index >= gl::MAX_VERTEX_ATTRIBS)
7784 {
7785 return gl::error(GL_INVALID_VALUE);
7786 }
7787
7788 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7789
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007790 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007791 {
7792 return;
7793 }
7794
7795 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7796 {
7797 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7798 for (int i = 0; i < 4; ++i)
7799 {
7800 params[i] = currentValueData.IntValues[i];
7801 }
7802 }
7803 else
7804 {
7805 *params = attribState.querySingleParameter<GLint>(pname);
7806 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007807 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007808 }
7809 catch(std::bad_alloc&)
7810 {
7811 return gl::error(GL_OUT_OF_MEMORY);
7812 }
7813}
7814
7815void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7816{
7817 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7818 index, pname, params);
7819
7820 try
7821 {
7822 gl::Context *context = gl::getNonLostContext();
7823
7824 if (context)
7825 {
7826 if (context->getClientVersion() < 3)
7827 {
7828 return gl::error(GL_INVALID_OPERATION);
7829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007830
Jamie Madilla7d05862013-07-02 11:57:06 -04007831 if (index >= gl::MAX_VERTEX_ATTRIBS)
7832 {
7833 return gl::error(GL_INVALID_VALUE);
7834 }
7835
7836 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7837
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007838 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007839 {
7840 return;
7841 }
7842
7843 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7844 {
7845 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7846 for (int i = 0; i < 4; ++i)
7847 {
7848 params[i] = currentValueData.UnsignedIntValues[i];
7849 }
7850 }
7851 else
7852 {
7853 *params = attribState.querySingleParameter<GLuint>(pname);
7854 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007856 }
7857 catch(std::bad_alloc&)
7858 {
7859 return gl::error(GL_OUT_OF_MEMORY);
7860 }
7861}
7862
7863void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7864{
7865 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7866 index, x, y, z, w);
7867
7868 try
7869 {
7870 gl::Context *context = gl::getNonLostContext();
7871
7872 if (context)
7873 {
7874 if (context->getClientVersion() < 3)
7875 {
7876 return gl::error(GL_INVALID_OPERATION);
7877 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007878
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007879 if (index >= gl::MAX_VERTEX_ATTRIBS)
7880 {
7881 return gl::error(GL_INVALID_VALUE);
7882 }
7883
7884 GLint vals[4] = { x, y, z, w };
7885 context->setVertexAttribi(index, vals);
7886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007887 }
7888 catch(std::bad_alloc&)
7889 {
7890 return gl::error(GL_OUT_OF_MEMORY);
7891 }
7892}
7893
7894void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7895{
7896 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7897 index, x, y, z, w);
7898
7899 try
7900 {
7901 gl::Context *context = gl::getNonLostContext();
7902
7903 if (context)
7904 {
7905 if (context->getClientVersion() < 3)
7906 {
7907 return gl::error(GL_INVALID_OPERATION);
7908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007909
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007910 if (index >= gl::MAX_VERTEX_ATTRIBS)
7911 {
7912 return gl::error(GL_INVALID_VALUE);
7913 }
7914
7915 GLuint vals[4] = { x, y, z, w };
7916 context->setVertexAttribu(index, vals);
7917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007918 }
7919 catch(std::bad_alloc&)
7920 {
7921 return gl::error(GL_OUT_OF_MEMORY);
7922 }
7923}
7924
7925void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7926{
7927 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7928
7929 try
7930 {
7931 gl::Context *context = gl::getNonLostContext();
7932
7933 if (context)
7934 {
7935 if (context->getClientVersion() < 3)
7936 {
7937 return gl::error(GL_INVALID_OPERATION);
7938 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007939
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007940 if (index >= gl::MAX_VERTEX_ATTRIBS)
7941 {
7942 return gl::error(GL_INVALID_VALUE);
7943 }
7944
7945 context->setVertexAttribi(index, v);
7946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007947 }
7948 catch(std::bad_alloc&)
7949 {
7950 return gl::error(GL_OUT_OF_MEMORY);
7951 }
7952}
7953
7954void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7955{
7956 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7957
7958 try
7959 {
7960 gl::Context *context = gl::getNonLostContext();
7961
7962 if (context)
7963 {
7964 if (context->getClientVersion() < 3)
7965 {
7966 return gl::error(GL_INVALID_OPERATION);
7967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007968
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007969 if (index >= gl::MAX_VERTEX_ATTRIBS)
7970 {
7971 return gl::error(GL_INVALID_VALUE);
7972 }
7973
7974 context->setVertexAttribu(index, v);
7975 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007976 }
7977 catch(std::bad_alloc&)
7978 {
7979 return gl::error(GL_OUT_OF_MEMORY);
7980 }
7981}
7982
7983void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7984{
7985 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7986 program, location, params);
7987
7988 try
7989 {
7990 gl::Context *context = gl::getNonLostContext();
7991
7992 if (context)
7993 {
7994 if (context->getClientVersion() < 3)
7995 {
7996 return gl::error(GL_INVALID_OPERATION);
7997 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007998
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007999 if (program == 0)
8000 {
8001 return gl::error(GL_INVALID_VALUE);
8002 }
8003
8004 gl::Program *programObject = context->getProgram(program);
8005
8006 if (!programObject || !programObject->isLinked())
8007 {
8008 return gl::error(GL_INVALID_OPERATION);
8009 }
8010
8011 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8012 if (!programBinary)
8013 {
8014 return gl::error(GL_INVALID_OPERATION);
8015 }
8016
8017 if (!programBinary->getUniformuiv(location, NULL, params))
8018 {
8019 return gl::error(GL_INVALID_OPERATION);
8020 }
8021 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008022 }
8023 catch(std::bad_alloc&)
8024 {
8025 return gl::error(GL_OUT_OF_MEMORY);
8026 }
8027}
8028
8029GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8030{
8031 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8032 program, name);
8033
8034 try
8035 {
8036 gl::Context *context = gl::getNonLostContext();
8037
8038 if (context)
8039 {
8040 if (context->getClientVersion() < 3)
8041 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008042 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008044
Jamie Madilld1e78c92013-06-20 11:55:50 -04008045 if (program == 0)
8046 {
8047 return gl::error(GL_INVALID_VALUE, -1);
8048 }
8049
8050 gl::Program *programObject = context->getProgram(program);
8051
8052 if (!programObject || !programObject->isLinked())
8053 {
8054 return gl::error(GL_INVALID_OPERATION, -1);
8055 }
8056
8057 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8058 if (!programBinary)
8059 {
8060 return gl::error(GL_INVALID_OPERATION, -1);
8061 }
8062
8063 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008065 }
8066 catch(std::bad_alloc&)
8067 {
8068 return gl::error(GL_OUT_OF_MEMORY, 0);
8069 }
8070
8071 return 0;
8072}
8073
8074void __stdcall glUniform1ui(GLint location, GLuint v0)
8075{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008076 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008077}
8078
8079void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8080{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008081 const GLuint xy[] = { v0, v1 };
8082 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008083}
8084
8085void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8086{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008087 const GLuint xyz[] = { v0, v1, v2 };
8088 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008089}
8090
8091void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8092{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008093 const GLuint xyzw[] = { v0, v1, v2, v3 };
8094 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008095}
8096
8097void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8098{
8099 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8100 location, count, value);
8101
8102 try
8103 {
8104 gl::Context *context = gl::getNonLostContext();
8105
8106 if (context)
8107 {
8108 if (context->getClientVersion() < 3)
8109 {
8110 return gl::error(GL_INVALID_OPERATION);
8111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008112
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008113 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8114 if (!programBinary)
8115 {
8116 return gl::error(GL_INVALID_OPERATION);
8117 }
8118
8119 if (!programBinary->setUniform1uiv(location, count, value))
8120 {
8121 return gl::error(GL_INVALID_OPERATION);
8122 }
8123 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008124 }
8125 catch(std::bad_alloc&)
8126 {
8127 return gl::error(GL_OUT_OF_MEMORY);
8128 }
8129}
8130
8131void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8132{
8133 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8134 location, count, value);
8135
8136 try
8137 {
8138 gl::Context *context = gl::getNonLostContext();
8139
8140 if (context)
8141 {
8142 if (context->getClientVersion() < 3)
8143 {
8144 return gl::error(GL_INVALID_OPERATION);
8145 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008146
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008147 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8148 if (!programBinary)
8149 {
8150 return gl::error(GL_INVALID_OPERATION);
8151 }
8152
8153 if (!programBinary->setUniform2uiv(location, count, value))
8154 {
8155 return gl::error(GL_INVALID_OPERATION);
8156 }
8157 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008158 }
8159 catch(std::bad_alloc&)
8160 {
8161 return gl::error(GL_OUT_OF_MEMORY);
8162 }
8163}
8164
8165void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8166{
8167 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8168 location, count, value);
8169
8170 try
8171 {
8172 gl::Context *context = gl::getNonLostContext();
8173
8174 if (context)
8175 {
8176 if (context->getClientVersion() < 3)
8177 {
8178 return gl::error(GL_INVALID_OPERATION);
8179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008181 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8182 if (!programBinary)
8183 {
8184 return gl::error(GL_INVALID_OPERATION);
8185 }
8186
8187 if (!programBinary->setUniform3uiv(location, count, value))
8188 {
8189 return gl::error(GL_INVALID_OPERATION);
8190 }
8191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008192 }
8193 catch(std::bad_alloc&)
8194 {
8195 return gl::error(GL_OUT_OF_MEMORY);
8196 }
8197}
8198
8199void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8200{
8201 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8202 location, count, value);
8203
8204 try
8205 {
8206 gl::Context *context = gl::getNonLostContext();
8207
8208 if (context)
8209 {
8210 if (context->getClientVersion() < 3)
8211 {
8212 return gl::error(GL_INVALID_OPERATION);
8213 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008214
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008215 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8216 if (!programBinary)
8217 {
8218 return gl::error(GL_INVALID_OPERATION);
8219 }
8220
8221 if (!programBinary->setUniform4uiv(location, count, value))
8222 {
8223 return gl::error(GL_INVALID_OPERATION);
8224 }
8225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008226 }
8227 catch(std::bad_alloc&)
8228 {
8229 return gl::error(GL_OUT_OF_MEMORY);
8230 }
8231}
8232
8233void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8234{
8235 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8236 buffer, drawbuffer, value);
8237
8238 try
8239 {
8240 gl::Context *context = gl::getNonLostContext();
8241
8242 if (context)
8243 {
8244 if (context->getClientVersion() < 3)
8245 {
8246 return gl::error(GL_INVALID_OPERATION);
8247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008248
Geoff Lang42359ca2013-08-21 13:25:17 -04008249 switch (buffer)
8250 {
8251 case GL_COLOR:
8252 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8253 {
8254 return gl::error(GL_INVALID_VALUE);
8255 }
8256 break;
8257 case GL_STENCIL:
8258 if (drawbuffer != 0)
8259 {
8260 return gl::error(GL_INVALID_VALUE);
8261 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008262 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008263 default:
8264 return gl::error(GL_INVALID_ENUM);
8265 }
8266
8267 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008269 }
8270 catch(std::bad_alloc&)
8271 {
8272 return gl::error(GL_OUT_OF_MEMORY);
8273 }
8274}
8275
8276void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8277{
8278 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8279 buffer, drawbuffer, value);
8280
8281 try
8282 {
8283 gl::Context *context = gl::getNonLostContext();
8284
8285 if (context)
8286 {
8287 if (context->getClientVersion() < 3)
8288 {
8289 return gl::error(GL_INVALID_OPERATION);
8290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008291
Geoff Lang42359ca2013-08-21 13:25:17 -04008292 switch (buffer)
8293 {
8294 case GL_COLOR:
8295 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8296 {
8297 return gl::error(GL_INVALID_VALUE);
8298 }
8299 break;
8300 default:
8301 return gl::error(GL_INVALID_ENUM);
8302 }
8303
8304 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008306 }
8307 catch(std::bad_alloc&)
8308 {
8309 return gl::error(GL_OUT_OF_MEMORY);
8310 }
8311}
8312
8313void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8314{
8315 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8316 buffer, drawbuffer, value);
8317
8318 try
8319 {
8320 gl::Context *context = gl::getNonLostContext();
8321
8322 if (context)
8323 {
8324 if (context->getClientVersion() < 3)
8325 {
8326 return gl::error(GL_INVALID_OPERATION);
8327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008328
Geoff Lang42359ca2013-08-21 13:25:17 -04008329 switch (buffer)
8330 {
8331 case GL_COLOR:
8332 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8333 {
8334 return gl::error(GL_INVALID_VALUE);
8335 }
8336 break;
8337 case GL_DEPTH:
8338 if (drawbuffer != 0)
8339 {
8340 return gl::error(GL_INVALID_VALUE);
8341 }
8342 break;
8343 default:
8344 return gl::error(GL_INVALID_ENUM);
8345 }
8346
8347 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008348 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008349 }
8350 catch(std::bad_alloc&)
8351 {
8352 return gl::error(GL_OUT_OF_MEMORY);
8353 }
8354}
8355
8356void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8357{
8358 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8359 buffer, drawbuffer, depth, stencil);
8360
8361 try
8362 {
8363 gl::Context *context = gl::getNonLostContext();
8364
8365 if (context)
8366 {
8367 if (context->getClientVersion() < 3)
8368 {
8369 return gl::error(GL_INVALID_OPERATION);
8370 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008371
Geoff Lang42359ca2013-08-21 13:25:17 -04008372 switch (buffer)
8373 {
8374 case GL_DEPTH_STENCIL:
8375 if (drawbuffer != 0)
8376 {
8377 return gl::error(GL_INVALID_VALUE);
8378 }
8379 break;
8380 default:
8381 return gl::error(GL_INVALID_ENUM);
8382 }
8383
8384 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008385 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008386 }
8387 catch(std::bad_alloc&)
8388 {
8389 return gl::error(GL_OUT_OF_MEMORY);
8390 }
8391}
8392
8393const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8394{
8395 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8396
8397 try
8398 {
8399 gl::Context *context = gl::getNonLostContext();
8400
8401 if (context)
8402 {
8403 if (context->getClientVersion() < 3)
8404 {
8405 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8406 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008407
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008408 if (name != GL_EXTENSIONS)
8409 {
8410 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8411 }
8412
8413 if (index >= context->getNumExtensions())
8414 {
8415 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8416 }
8417
8418 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008420 }
8421 catch(std::bad_alloc&)
8422 {
8423 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8424 }
8425
8426 return NULL;
8427}
8428
8429void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8430{
8431 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8432 readTarget, writeTarget, readOffset, writeOffset, size);
8433
8434 try
8435 {
8436 gl::Context *context = gl::getNonLostContext();
8437
8438 if (context)
8439 {
8440 if (context->getClientVersion() < 3)
8441 {
8442 return gl::error(GL_INVALID_OPERATION);
8443 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008444
Jamie Madill8c96d582014-03-05 15:01:23 -05008445 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008446 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008447 return gl::error(GL_INVALID_ENUM);
8448 }
8449
Jamie Madill8c96d582014-03-05 15:01:23 -05008450 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8451 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008452
8453 if (!readBuffer || !writeBuffer)
8454 {
8455 return gl::error(GL_INVALID_OPERATION);
8456 }
8457
Jamie Madill7a5f7382014-03-05 15:01:24 -05008458 if (readBuffer->mapped() || writeBuffer->mapped())
8459 {
8460 return gl::error(GL_INVALID_OPERATION);
8461 }
8462
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008463 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8464 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8465 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8466 {
8467 return gl::error(GL_INVALID_VALUE);
8468 }
8469
8470 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8471 {
8472 return gl::error(GL_INVALID_VALUE);
8473 }
8474
8475 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8476
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008477 // if size is zero, the copy is a successful no-op
8478 if (size > 0)
8479 {
8480 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8481 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008483 }
8484 catch(std::bad_alloc&)
8485 {
8486 return gl::error(GL_OUT_OF_MEMORY);
8487 }
8488}
8489
8490void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8491{
8492 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8493 program, uniformCount, uniformNames, uniformIndices);
8494
8495 try
8496 {
8497 gl::Context *context = gl::getNonLostContext();
8498
8499 if (context)
8500 {
8501 if (context->getClientVersion() < 3)
8502 {
8503 return gl::error(GL_INVALID_OPERATION);
8504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008505
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008506 if (uniformCount < 0)
8507 {
8508 return gl::error(GL_INVALID_VALUE);
8509 }
8510
8511 gl::Program *programObject = context->getProgram(program);
8512
8513 if (!programObject)
8514 {
8515 if (context->getShader(program))
8516 {
8517 return gl::error(GL_INVALID_OPERATION);
8518 }
8519 else
8520 {
8521 return gl::error(GL_INVALID_VALUE);
8522 }
8523 }
8524
8525 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8526 if (!programObject->isLinked() || !programBinary)
8527 {
8528 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8529 {
8530 uniformIndices[uniformId] = GL_INVALID_INDEX;
8531 }
8532 }
8533 else
8534 {
8535 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8536 {
8537 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8538 }
8539 }
8540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008541 }
8542 catch(std::bad_alloc&)
8543 {
8544 return gl::error(GL_OUT_OF_MEMORY);
8545 }
8546}
8547
8548void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8549{
8550 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8551 program, uniformCount, uniformIndices, pname, params);
8552
8553 try
8554 {
8555 gl::Context *context = gl::getNonLostContext();
8556
8557 if (context)
8558 {
8559 if (context->getClientVersion() < 3)
8560 {
8561 return gl::error(GL_INVALID_OPERATION);
8562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008563
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008564 if (uniformCount < 0)
8565 {
8566 return gl::error(GL_INVALID_VALUE);
8567 }
8568
8569 gl::Program *programObject = context->getProgram(program);
8570
8571 if (!programObject)
8572 {
8573 if (context->getShader(program))
8574 {
8575 return gl::error(GL_INVALID_OPERATION);
8576 }
8577 else
8578 {
8579 return gl::error(GL_INVALID_VALUE);
8580 }
8581 }
8582
8583 switch (pname)
8584 {
8585 case GL_UNIFORM_TYPE:
8586 case GL_UNIFORM_SIZE:
8587 case GL_UNIFORM_NAME_LENGTH:
8588 case GL_UNIFORM_BLOCK_INDEX:
8589 case GL_UNIFORM_OFFSET:
8590 case GL_UNIFORM_ARRAY_STRIDE:
8591 case GL_UNIFORM_MATRIX_STRIDE:
8592 case GL_UNIFORM_IS_ROW_MAJOR:
8593 break;
8594 default:
8595 return gl::error(GL_INVALID_ENUM);
8596 }
8597
8598 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8599
8600 if (!programBinary && uniformCount > 0)
8601 {
8602 return gl::error(GL_INVALID_VALUE);
8603 }
8604
8605 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8606 {
8607 const GLuint index = uniformIndices[uniformId];
8608
8609 if (index >= (GLuint)programBinary->getActiveUniformCount())
8610 {
8611 return gl::error(GL_INVALID_VALUE);
8612 }
8613 }
8614
8615 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8616 {
8617 const GLuint index = uniformIndices[uniformId];
8618 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8619 }
8620 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008621 }
8622 catch(std::bad_alloc&)
8623 {
8624 return gl::error(GL_OUT_OF_MEMORY);
8625 }
8626}
8627
8628GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8629{
8630 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8631
8632 try
8633 {
8634 gl::Context *context = gl::getNonLostContext();
8635
8636 if (context)
8637 {
8638 if (context->getClientVersion() < 3)
8639 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008640 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008641 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008642
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008643 gl::Program *programObject = context->getProgram(program);
8644
8645 if (!programObject)
8646 {
8647 if (context->getShader(program))
8648 {
8649 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8650 }
8651 else
8652 {
8653 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8654 }
8655 }
8656
8657 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8658 if (!programBinary)
8659 {
8660 return GL_INVALID_INDEX;
8661 }
8662
8663 return programBinary->getUniformBlockIndex(uniformBlockName);
8664 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008665 }
8666 catch(std::bad_alloc&)
8667 {
8668 return gl::error(GL_OUT_OF_MEMORY, 0);
8669 }
8670
8671 return 0;
8672}
8673
8674void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8675{
8676 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8677 program, uniformBlockIndex, pname, params);
8678
8679 try
8680 {
8681 gl::Context *context = gl::getNonLostContext();
8682
8683 if (context)
8684 {
8685 if (context->getClientVersion() < 3)
8686 {
8687 return gl::error(GL_INVALID_OPERATION);
8688 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008689 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008690
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008691 if (!programObject)
8692 {
8693 if (context->getShader(program))
8694 {
8695 return gl::error(GL_INVALID_OPERATION);
8696 }
8697 else
8698 {
8699 return gl::error(GL_INVALID_VALUE);
8700 }
8701 }
8702
8703 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8704
8705 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8706 {
8707 return gl::error(GL_INVALID_VALUE);
8708 }
8709
8710 switch (pname)
8711 {
8712 case GL_UNIFORM_BLOCK_BINDING:
8713 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8714 break;
8715
8716 case GL_UNIFORM_BLOCK_DATA_SIZE:
8717 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8718 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8719 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8720 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8721 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8722 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8723 break;
8724
8725 default:
8726 return gl::error(GL_INVALID_ENUM);
8727 }
8728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008729 }
8730 catch(std::bad_alloc&)
8731 {
8732 return gl::error(GL_OUT_OF_MEMORY);
8733 }
8734}
8735
8736void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8737{
8738 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8739 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8740
8741 try
8742 {
8743 gl::Context *context = gl::getNonLostContext();
8744
8745 if (context)
8746 {
8747 if (context->getClientVersion() < 3)
8748 {
8749 return gl::error(GL_INVALID_OPERATION);
8750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008751
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008752 gl::Program *programObject = context->getProgram(program);
8753
8754 if (!programObject)
8755 {
8756 if (context->getShader(program))
8757 {
8758 return gl::error(GL_INVALID_OPERATION);
8759 }
8760 else
8761 {
8762 return gl::error(GL_INVALID_VALUE);
8763 }
8764 }
8765
8766 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8767
8768 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8769 {
8770 return gl::error(GL_INVALID_VALUE);
8771 }
8772
8773 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008775 }
8776 catch(std::bad_alloc&)
8777 {
8778 return gl::error(GL_OUT_OF_MEMORY);
8779 }
8780}
8781
8782void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8783{
8784 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8785 program, uniformBlockIndex, uniformBlockBinding);
8786
8787 try
8788 {
8789 gl::Context *context = gl::getNonLostContext();
8790
8791 if (context)
8792 {
8793 if (context->getClientVersion() < 3)
8794 {
8795 return gl::error(GL_INVALID_OPERATION);
8796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008797
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008798 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8799 {
8800 return gl::error(GL_INVALID_VALUE);
8801 }
8802
8803 gl::Program *programObject = context->getProgram(program);
8804
8805 if (!programObject)
8806 {
8807 if (context->getShader(program))
8808 {
8809 return gl::error(GL_INVALID_OPERATION);
8810 }
8811 else
8812 {
8813 return gl::error(GL_INVALID_VALUE);
8814 }
8815 }
8816
8817 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8818
8819 // if never linked, there won't be any uniform blocks
8820 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8821 {
8822 return gl::error(GL_INVALID_VALUE);
8823 }
8824
8825 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8826 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008827 }
8828 catch(std::bad_alloc&)
8829 {
8830 return gl::error(GL_OUT_OF_MEMORY);
8831 }
8832}
8833
8834void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8835{
8836 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8837 mode, first, count, instanceCount);
8838
8839 try
8840 {
8841 gl::Context *context = gl::getNonLostContext();
8842
8843 if (context)
8844 {
8845 if (context->getClientVersion() < 3)
8846 {
8847 return gl::error(GL_INVALID_OPERATION);
8848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008849
Jamie Madill54133512013-06-21 09:33:07 -04008850 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008851 UNIMPLEMENTED();
8852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008853 }
8854 catch(std::bad_alloc&)
8855 {
8856 return gl::error(GL_OUT_OF_MEMORY);
8857 }
8858}
8859
8860void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8861{
8862 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8863 mode, count, type, indices, instanceCount);
8864
8865 try
8866 {
8867 gl::Context *context = gl::getNonLostContext();
8868
8869 if (context)
8870 {
8871 if (context->getClientVersion() < 3)
8872 {
8873 return gl::error(GL_INVALID_OPERATION);
8874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008875
Jamie Madill54133512013-06-21 09:33:07 -04008876 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008877 UNIMPLEMENTED();
8878 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008879 }
8880 catch(std::bad_alloc&)
8881 {
8882 return gl::error(GL_OUT_OF_MEMORY);
8883 }
8884}
8885
8886GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8887{
8888 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8889
8890 try
8891 {
8892 gl::Context *context = gl::getNonLostContext();
8893
8894 if (context)
8895 {
8896 if (context->getClientVersion() < 3)
8897 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008898 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008900
Jamie Madill5215e1a2013-07-26 11:55:19 -04008901 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8902 {
8903 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8904 }
8905
8906 if (flags != 0)
8907 {
8908 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8909 }
8910
8911 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008913 }
8914 catch(std::bad_alloc&)
8915 {
8916 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8917 }
8918
8919 return NULL;
8920}
8921
8922GLboolean __stdcall glIsSync(GLsync sync)
8923{
8924 EVENT("(GLsync sync = 0x%0.8p)", sync);
8925
8926 try
8927 {
8928 gl::Context *context = gl::getNonLostContext();
8929
8930 if (context)
8931 {
8932 if (context->getClientVersion() < 3)
8933 {
8934 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008936
Jamie Madill5215e1a2013-07-26 11:55:19 -04008937 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008938 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008939 }
8940 catch(std::bad_alloc&)
8941 {
8942 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8943 }
8944
8945 return GL_FALSE;
8946}
8947
8948void __stdcall glDeleteSync(GLsync sync)
8949{
8950 EVENT("(GLsync sync = 0x%0.8p)", sync);
8951
8952 try
8953 {
8954 gl::Context *context = gl::getNonLostContext();
8955
8956 if (context)
8957 {
8958 if (context->getClientVersion() < 3)
8959 {
8960 return gl::error(GL_INVALID_OPERATION);
8961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008962
Jamie Madill5215e1a2013-07-26 11:55:19 -04008963 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8964 {
8965 return gl::error(GL_INVALID_VALUE);
8966 }
8967
8968 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008969 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008970 }
8971 catch(std::bad_alloc&)
8972 {
8973 return gl::error(GL_OUT_OF_MEMORY);
8974 }
8975}
8976
8977GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8978{
8979 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8980 sync, flags, timeout);
8981
8982 try
8983 {
8984 gl::Context *context = gl::getNonLostContext();
8985
8986 if (context)
8987 {
8988 if (context->getClientVersion() < 3)
8989 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008990 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008991 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008992
Jamie Madill5215e1a2013-07-26 11:55:19 -04008993 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8994 {
8995 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8996 }
8997
8998 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8999
9000 if (!fenceSync)
9001 {
9002 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9003 }
9004
9005 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009007 }
9008 catch(std::bad_alloc&)
9009 {
9010 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9011 }
9012
9013 return GL_FALSE;
9014}
9015
9016void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9017{
9018 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9019 sync, flags, timeout);
9020
9021 try
9022 {
9023 gl::Context *context = gl::getNonLostContext();
9024
9025 if (context)
9026 {
9027 if (context->getClientVersion() < 3)
9028 {
9029 return gl::error(GL_INVALID_OPERATION);
9030 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009031
Jamie Madill5215e1a2013-07-26 11:55:19 -04009032 if (flags != 0)
9033 {
9034 return gl::error(GL_INVALID_VALUE);
9035 }
9036
9037 if (timeout != GL_TIMEOUT_IGNORED)
9038 {
9039 return gl::error(GL_INVALID_VALUE);
9040 }
9041
9042 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9043
9044 if (!fenceSync)
9045 {
9046 return gl::error(GL_INVALID_VALUE);
9047 }
9048
9049 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009051 }
9052 catch(std::bad_alloc&)
9053 {
9054 return gl::error(GL_OUT_OF_MEMORY);
9055 }
9056}
9057
9058void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9059{
9060 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9061 pname, params);
9062
9063 try
9064 {
9065 gl::Context *context = gl::getNonLostContext();
9066
9067 if (context)
9068 {
9069 if (context->getClientVersion() < 3)
9070 {
9071 return gl::error(GL_INVALID_OPERATION);
9072 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009073
Jamie Madill79f2f452013-12-19 11:13:02 -05009074 GLenum nativeType;
9075 unsigned int numParams = 0;
9076 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9077 return gl::error(GL_INVALID_ENUM);
9078
9079 // pname is valid, but that there are no parameters to return.
9080 if (numParams == 0)
9081 return;
9082
9083 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009084 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009085 context->getInteger64v(pname, params);
9086 }
Jamie Madill55856b12014-01-02 13:59:50 -05009087 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009088 {
Jamie Madill55856b12014-01-02 13:59:50 -05009089 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009090 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009091 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009092 }
9093 catch(std::bad_alloc&)
9094 {
9095 return gl::error(GL_OUT_OF_MEMORY);
9096 }
9097}
9098
9099void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9100{
9101 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9102 sync, pname, bufSize, length, values);
9103
9104 try
9105 {
9106 gl::Context *context = gl::getNonLostContext();
9107
9108 if (context)
9109 {
9110 if (context->getClientVersion() < 3)
9111 {
9112 return gl::error(GL_INVALID_OPERATION);
9113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009114
Jamie Madill5215e1a2013-07-26 11:55:19 -04009115 if (bufSize < 0)
9116 {
9117 return gl::error(GL_INVALID_VALUE);
9118 }
9119
9120 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9121
9122 if (!fenceSync)
9123 {
9124 return gl::error(GL_INVALID_VALUE);
9125 }
9126
9127 switch (pname)
9128 {
9129 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9130 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9131 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9132 case GL_SYNC_FLAGS: values[0] = 0; break;
9133
9134 default:
9135 return gl::error(GL_INVALID_ENUM);
9136 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009138 }
9139 catch(std::bad_alloc&)
9140 {
9141 return gl::error(GL_OUT_OF_MEMORY);
9142 }
9143}
9144
9145void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9146{
9147 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9148 target, index, data);
9149
9150 try
9151 {
9152 gl::Context *context = gl::getNonLostContext();
9153
9154 if (context)
9155 {
9156 if (context->getClientVersion() < 3)
9157 {
9158 return gl::error(GL_INVALID_OPERATION);
9159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160
Shannon Woods15934d52013-08-19 14:28:49 -04009161 switch (target)
9162 {
9163 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9164 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9165 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9166 if (index >= context->getMaxTransformFeedbackBufferBindings())
9167 return gl::error(GL_INVALID_VALUE);
9168 break;
9169 case GL_UNIFORM_BUFFER_START:
9170 case GL_UNIFORM_BUFFER_SIZE:
9171 case GL_UNIFORM_BUFFER_BINDING:
9172 if (index >= context->getMaximumCombinedUniformBufferBindings())
9173 return gl::error(GL_INVALID_VALUE);
9174 break;
9175 default:
9176 return gl::error(GL_INVALID_ENUM);
9177 }
9178
9179 if (!(context->getIndexedInteger64v(target, index, data)))
9180 {
9181 GLenum nativeType;
9182 unsigned int numParams = 0;
9183 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9184 return gl::error(GL_INVALID_ENUM);
9185
9186 if (numParams == 0)
9187 return; // it is known that pname is valid, but there are no parameters to return
9188
9189 if (nativeType == GL_INT)
9190 {
9191 GLint *intParams = new GLint[numParams];
9192
9193 context->getIndexedIntegerv(target, index, intParams);
9194
9195 for (unsigned int i = 0; i < numParams; ++i)
9196 {
9197 data[i] = static_cast<GLint64>(intParams[i]);
9198 }
9199
9200 delete [] intParams;
9201 }
9202 else
9203 {
9204 UNREACHABLE();
9205 }
9206 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009207 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009208 }
9209 catch(std::bad_alloc&)
9210 {
9211 return gl::error(GL_OUT_OF_MEMORY);
9212 }
9213}
9214
9215void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9216{
9217 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9218 target, pname, params);
9219
9220 try
9221 {
9222 gl::Context *context = gl::getNonLostContext();
9223
9224 if (context)
9225 {
9226 if (context->getClientVersion() < 3)
9227 {
9228 return gl::error(GL_INVALID_OPERATION);
9229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009230
Jamie Madill54133512013-06-21 09:33:07 -04009231 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009232 UNIMPLEMENTED();
9233 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009234 }
9235 catch(std::bad_alloc&)
9236 {
9237 return gl::error(GL_OUT_OF_MEMORY);
9238 }
9239}
9240
9241void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9242{
9243 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9244
9245 try
9246 {
9247 gl::Context *context = gl::getNonLostContext();
9248
9249 if (context)
9250 {
9251 if (context->getClientVersion() < 3)
9252 {
9253 return gl::error(GL_INVALID_OPERATION);
9254 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009255
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009256 if (count < 0)
9257 {
9258 return gl::error(GL_INVALID_VALUE);
9259 }
9260
9261 for (int i = 0; i < count; i++)
9262 {
9263 samplers[i] = context->createSampler();
9264 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009266 }
9267 catch(std::bad_alloc&)
9268 {
9269 return gl::error(GL_OUT_OF_MEMORY);
9270 }
9271}
9272
9273void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9274{
9275 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9276
9277 try
9278 {
9279 gl::Context *context = gl::getNonLostContext();
9280
9281 if (context)
9282 {
9283 if (context->getClientVersion() < 3)
9284 {
9285 return gl::error(GL_INVALID_OPERATION);
9286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009287
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009288 if (count < 0)
9289 {
9290 return gl::error(GL_INVALID_VALUE);
9291 }
9292
9293 for (int i = 0; i < count; i++)
9294 {
9295 context->deleteSampler(samplers[i]);
9296 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009298 }
9299 catch(std::bad_alloc&)
9300 {
9301 return gl::error(GL_OUT_OF_MEMORY);
9302 }
9303}
9304
9305GLboolean __stdcall glIsSampler(GLuint sampler)
9306{
9307 EVENT("(GLuint sampler = %u)", sampler);
9308
9309 try
9310 {
9311 gl::Context *context = gl::getNonLostContext();
9312
9313 if (context)
9314 {
9315 if (context->getClientVersion() < 3)
9316 {
9317 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009319
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009320 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009322 }
9323 catch(std::bad_alloc&)
9324 {
9325 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9326 }
9327
9328 return GL_FALSE;
9329}
9330
9331void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9332{
9333 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9334
9335 try
9336 {
9337 gl::Context *context = gl::getNonLostContext();
9338
9339 if (context)
9340 {
9341 if (context->getClientVersion() < 3)
9342 {
9343 return gl::error(GL_INVALID_OPERATION);
9344 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009345
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009346 if (sampler != 0 && !context->isSampler(sampler))
9347 {
9348 return gl::error(GL_INVALID_OPERATION);
9349 }
9350
9351 if (unit >= context->getMaximumCombinedTextureImageUnits())
9352 {
9353 return gl::error(GL_INVALID_VALUE);
9354 }
9355
9356 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009358 }
9359 catch(std::bad_alloc&)
9360 {
9361 return gl::error(GL_OUT_OF_MEMORY);
9362 }
9363}
9364
9365void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9366{
9367 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9368
9369 try
9370 {
9371 gl::Context *context = gl::getNonLostContext();
9372
9373 if (context)
9374 {
9375 if (context->getClientVersion() < 3)
9376 {
9377 return gl::error(GL_INVALID_OPERATION);
9378 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009379
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009380 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009381 {
9382 return;
9383 }
9384
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009385 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009386 {
9387 return;
9388 }
9389
9390 if (!context->isSampler(sampler))
9391 {
9392 return gl::error(GL_INVALID_OPERATION);
9393 }
9394
9395 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009396 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009397 }
9398 catch(std::bad_alloc&)
9399 {
9400 return gl::error(GL_OUT_OF_MEMORY);
9401 }
9402}
9403
9404void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9405{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009406 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009407}
9408
9409void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9410{
9411 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9412
9413 try
9414 {
9415 gl::Context *context = gl::getNonLostContext();
9416
9417 if (context)
9418 {
9419 if (context->getClientVersion() < 3)
9420 {
9421 return gl::error(GL_INVALID_OPERATION);
9422 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009423
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009424 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009425 {
9426 return;
9427 }
9428
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009429 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009430 {
9431 return;
9432 }
9433
9434 if (!context->isSampler(sampler))
9435 {
9436 return gl::error(GL_INVALID_OPERATION);
9437 }
9438
9439 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009440 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009441 }
9442 catch(std::bad_alloc&)
9443 {
9444 return gl::error(GL_OUT_OF_MEMORY);
9445 }
9446}
9447
9448void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9449{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009450 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009451}
9452
9453void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9454{
9455 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9456
9457 try
9458 {
9459 gl::Context *context = gl::getNonLostContext();
9460
9461 if (context)
9462 {
9463 if (context->getClientVersion() < 3)
9464 {
9465 return gl::error(GL_INVALID_OPERATION);
9466 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009467
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009468 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009469 {
9470 return;
9471 }
9472
9473 if (!context->isSampler(sampler))
9474 {
9475 return gl::error(GL_INVALID_OPERATION);
9476 }
9477
9478 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009480 }
9481 catch(std::bad_alloc&)
9482 {
9483 return gl::error(GL_OUT_OF_MEMORY);
9484 }
9485}
9486
9487void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9488{
9489 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9490
9491 try
9492 {
9493 gl::Context *context = gl::getNonLostContext();
9494
9495 if (context)
9496 {
9497 if (context->getClientVersion() < 3)
9498 {
9499 return gl::error(GL_INVALID_OPERATION);
9500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009501
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009502 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009503 {
9504 return;
9505 }
9506
9507 if (!context->isSampler(sampler))
9508 {
9509 return gl::error(GL_INVALID_OPERATION);
9510 }
9511
9512 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009514 }
9515 catch(std::bad_alloc&)
9516 {
9517 return gl::error(GL_OUT_OF_MEMORY);
9518 }
9519}
9520
9521void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9522{
9523 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9524
9525 try
9526 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009527 if (index >= gl::MAX_VERTEX_ATTRIBS)
9528 {
9529 return gl::error(GL_INVALID_VALUE);
9530 }
9531
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009532 gl::Context *context = gl::getNonLostContext();
9533
9534 if (context)
9535 {
9536 if (context->getClientVersion() < 3)
9537 {
9538 return gl::error(GL_INVALID_OPERATION);
9539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009540
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009541 context->setVertexAttribDivisor(index, divisor);
9542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009543 }
9544 catch(std::bad_alloc&)
9545 {
9546 return gl::error(GL_OUT_OF_MEMORY);
9547 }
9548}
9549
9550void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9551{
9552 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9553
9554 try
9555 {
9556 gl::Context *context = gl::getNonLostContext();
9557
9558 if (context)
9559 {
9560 if (context->getClientVersion() < 3)
9561 {
9562 return gl::error(GL_INVALID_OPERATION);
9563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009564
Geoff Langc8058452014-02-03 12:04:11 -05009565 switch (target)
9566 {
9567 case GL_TRANSFORM_FEEDBACK:
9568 {
9569 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9570 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9571 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9572 {
9573 return gl::error(GL_INVALID_OPERATION);
9574 }
9575
9576 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9577 if (context->getTransformFeedback(id) == NULL)
9578 {
9579 return gl::error(GL_INVALID_OPERATION);
9580 }
9581
9582 context->bindTransformFeedback(id);
9583 }
9584 break;
9585
9586 default:
9587 return gl::error(GL_INVALID_ENUM);
9588 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009589 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009590 }
9591 catch(std::bad_alloc&)
9592 {
9593 return gl::error(GL_OUT_OF_MEMORY);
9594 }
9595}
9596
9597void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9598{
9599 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9600
9601 try
9602 {
9603 gl::Context *context = gl::getNonLostContext();
9604
9605 if (context)
9606 {
9607 if (context->getClientVersion() < 3)
9608 {
9609 return gl::error(GL_INVALID_OPERATION);
9610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009611
Geoff Langc8058452014-02-03 12:04:11 -05009612 for (int i = 0; i < n; i++)
9613 {
9614 context->deleteTransformFeedback(ids[i]);
9615 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009617 }
9618 catch(std::bad_alloc&)
9619 {
9620 return gl::error(GL_OUT_OF_MEMORY);
9621 }
9622}
9623
9624void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9625{
9626 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9627
9628 try
9629 {
9630 gl::Context *context = gl::getNonLostContext();
9631
9632 if (context)
9633 {
9634 if (context->getClientVersion() < 3)
9635 {
9636 return gl::error(GL_INVALID_OPERATION);
9637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009638
Geoff Langc8058452014-02-03 12:04:11 -05009639 for (int i = 0; i < n; i++)
9640 {
9641 ids[i] = context->createTransformFeedback();
9642 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009643 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009644 }
9645 catch(std::bad_alloc&)
9646 {
9647 return gl::error(GL_OUT_OF_MEMORY);
9648 }
9649}
9650
9651GLboolean __stdcall glIsTransformFeedback(GLuint id)
9652{
9653 EVENT("(GLuint id = %u)", id);
9654
9655 try
9656 {
9657 gl::Context *context = gl::getNonLostContext();
9658
9659 if (context)
9660 {
9661 if (context->getClientVersion() < 3)
9662 {
9663 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9664 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009665
Geoff Langc8058452014-02-03 12:04:11 -05009666 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009668 }
9669 catch(std::bad_alloc&)
9670 {
9671 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9672 }
9673
9674 return GL_FALSE;
9675}
9676
9677void __stdcall glPauseTransformFeedback(void)
9678{
9679 EVENT("(void)");
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 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9693 ASSERT(transformFeedback != NULL);
9694
9695 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9696 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9697 {
9698 return gl::error(GL_INVALID_OPERATION);
9699 }
9700
9701 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009703 }
9704 catch(std::bad_alloc&)
9705 {
9706 return gl::error(GL_OUT_OF_MEMORY);
9707 }
9708}
9709
9710void __stdcall glResumeTransformFeedback(void)
9711{
9712 EVENT("(void)");
9713
9714 try
9715 {
9716 gl::Context *context = gl::getNonLostContext();
9717
9718 if (context)
9719 {
9720 if (context->getClientVersion() < 3)
9721 {
9722 return gl::error(GL_INVALID_OPERATION);
9723 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009724
Geoff Langc8058452014-02-03 12:04:11 -05009725 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9726 ASSERT(transformFeedback != NULL);
9727
9728 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9729 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9730 {
9731 return gl::error(GL_INVALID_OPERATION);
9732 }
9733
9734 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009735 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009736 }
9737 catch(std::bad_alloc&)
9738 {
9739 return gl::error(GL_OUT_OF_MEMORY);
9740 }
9741}
9742
9743void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9744{
9745 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9746 program, bufSize, length, binaryFormat, binary);
9747
9748 try
9749 {
9750 gl::Context *context = gl::getNonLostContext();
9751
9752 if (context)
9753 {
9754 if (context->getClientVersion() < 3)
9755 {
9756 return gl::error(GL_INVALID_OPERATION);
9757 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009758
Jamie Madill54133512013-06-21 09:33:07 -04009759 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009760 UNIMPLEMENTED();
9761 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009762 }
9763 catch(std::bad_alloc&)
9764 {
9765 return gl::error(GL_OUT_OF_MEMORY);
9766 }
9767}
9768
9769void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9770{
9771 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9772 program, binaryFormat, binary, length);
9773
9774 try
9775 {
9776 gl::Context *context = gl::getNonLostContext();
9777
9778 if (context)
9779 {
9780 if (context->getClientVersion() < 3)
9781 {
9782 return gl::error(GL_INVALID_OPERATION);
9783 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009784
Jamie Madill54133512013-06-21 09:33:07 -04009785 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009786 UNIMPLEMENTED();
9787 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009788 }
9789 catch(std::bad_alloc&)
9790 {
9791 return gl::error(GL_OUT_OF_MEMORY);
9792 }
9793}
9794
9795void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9796{
9797 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9798 program, pname, value);
9799
9800 try
9801 {
9802 gl::Context *context = gl::getNonLostContext();
9803
9804 if (context)
9805 {
9806 if (context->getClientVersion() < 3)
9807 {
9808 return gl::error(GL_INVALID_OPERATION);
9809 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009810
Jamie Madill54133512013-06-21 09:33:07 -04009811 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009812 UNIMPLEMENTED();
9813 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009814 }
9815 catch(std::bad_alloc&)
9816 {
9817 return gl::error(GL_OUT_OF_MEMORY);
9818 }
9819}
9820
9821void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9822{
9823 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9824 target, numAttachments, attachments);
9825
9826 try
9827 {
9828 gl::Context *context = gl::getNonLostContext();
9829
9830 if (context)
9831 {
9832 if (context->getClientVersion() < 3)
9833 {
9834 return gl::error(GL_INVALID_OPERATION);
9835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009836
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009837 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009838 {
9839 return;
9840 }
9841
9842 int maxDimension = context->getMaximumRenderbufferDimension();
9843 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009845 }
9846 catch(std::bad_alloc&)
9847 {
9848 return gl::error(GL_OUT_OF_MEMORY);
9849 }
9850}
9851
9852void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9853{
9854 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9855 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9856 target, numAttachments, attachments, x, y, width, height);
9857
9858 try
9859 {
9860 gl::Context *context = gl::getNonLostContext();
9861
9862 if (context)
9863 {
9864 if (context->getClientVersion() < 3)
9865 {
9866 return gl::error(GL_INVALID_OPERATION);
9867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009868
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009869 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009870 {
9871 return;
9872 }
9873
9874 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009876 }
9877 catch(std::bad_alloc&)
9878 {
9879 return gl::error(GL_OUT_OF_MEMORY);
9880 }
9881}
9882
9883void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9884{
9885 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9886 target, levels, internalformat, width, height);
9887
9888 try
9889 {
9890 gl::Context *context = gl::getNonLostContext();
9891
9892 if (context)
9893 {
9894 if (context->getClientVersion() < 3)
9895 {
9896 return gl::error(GL_INVALID_OPERATION);
9897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009898
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009899 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009900 {
9901 return;
9902 }
9903
9904 switch (target)
9905 {
9906 case GL_TEXTURE_2D:
9907 {
9908 gl::Texture2D *texture2d = context->getTexture2D();
9909 texture2d->storage(levels, internalformat, width, height);
9910 }
9911 break;
9912
Geoff Lang01c21d22013-09-24 11:52:16 -04009913 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009914 {
9915 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9916 textureCube->storage(levels, internalformat, width);
9917 }
9918 break;
9919
9920 default:
9921 return gl::error(GL_INVALID_ENUM);
9922 }
9923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009924 }
9925 catch(std::bad_alloc&)
9926 {
9927 return gl::error(GL_OUT_OF_MEMORY);
9928 }
9929}
9930
9931void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9932{
9933 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9934 "GLsizei height = %d, GLsizei depth = %d)",
9935 target, levels, internalformat, width, height, depth);
9936
9937 try
9938 {
9939 gl::Context *context = gl::getNonLostContext();
9940
9941 if (context)
9942 {
9943 if (context->getClientVersion() < 3)
9944 {
9945 return gl::error(GL_INVALID_OPERATION);
9946 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009947
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009948 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009949 {
9950 return;
9951 }
9952
9953 switch (target)
9954 {
9955 case GL_TEXTURE_3D:
9956 {
9957 gl::Texture3D *texture3d = context->getTexture3D();
9958 texture3d->storage(levels, internalformat, width, height, depth);
9959 }
9960 break;
9961
9962 case GL_TEXTURE_2D_ARRAY:
9963 {
9964 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9965 texture2darray->storage(levels, internalformat, width, height, depth);
9966 }
9967 break;
9968
9969 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009970 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009971 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009972 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009973 }
9974 catch(std::bad_alloc&)
9975 {
9976 return gl::error(GL_OUT_OF_MEMORY);
9977 }
9978}
9979
9980void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9981{
9982 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9983 "GLint* params = 0x%0.8p)",
9984 target, internalformat, pname, bufSize, params);
9985
9986 try
9987 {
9988 gl::Context *context = gl::getNonLostContext();
9989
9990 if (context)
9991 {
9992 if (context->getClientVersion() < 3)
9993 {
9994 return gl::error(GL_INVALID_OPERATION);
9995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009996
Shannon Woods809d2502013-07-08 10:32:18 -04009997 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9998 !gl::IsDepthRenderingSupported(internalformat, context) &&
9999 !gl::IsStencilRenderingSupported(internalformat, context))
10000 {
10001 return gl::error(GL_INVALID_ENUM);
10002 }
10003
10004 if (target != GL_RENDERBUFFER)
10005 {
10006 return gl::error(GL_INVALID_ENUM);
10007 }
10008
10009 if (bufSize < 0)
10010 {
10011 return gl::error(GL_INVALID_VALUE);
10012 }
10013
10014 switch (pname)
10015 {
10016 case GL_NUM_SAMPLE_COUNTS:
10017 if (bufSize != 0)
10018 *params = context->getNumSampleCounts(internalformat);
10019 break;
10020 case GL_SAMPLES:
10021 context->getSampleCounts(internalformat, bufSize, params);
10022 break;
10023 default:
10024 return gl::error(GL_INVALID_ENUM);
10025 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010027 }
10028 catch(std::bad_alloc&)
10029 {
10030 return gl::error(GL_OUT_OF_MEMORY);
10031 }
10032}
10033
10034// Extension functions
10035
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010036void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10037 GLbitfield mask, GLenum filter)
10038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010039 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010040 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10041 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10042 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10043
10044 try
10045 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010047
10048 if (context)
10049 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010050 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010051 dstX0, dstY0, dstX1, dstY1, mask, filter,
10052 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010053 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010054 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010055 }
10056
Geoff Lang758d5b22013-06-11 11:42:50 -040010057 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10058 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010059 }
10060 }
10061 catch(std::bad_alloc&)
10062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010063 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010064 }
10065}
10066
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010067void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10068 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010069{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010070 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010071 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010072 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010073 target, level, internalformat, width, height, depth, border, format, type, pixels);
10074
10075 try
10076 {
10077 UNIMPLEMENTED(); // FIXME
10078 }
10079 catch(std::bad_alloc&)
10080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010081 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010082 }
10083}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010084
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010085void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10086 GLenum *binaryFormat, void *binary)
10087{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010088 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 +000010089 program, bufSize, length, binaryFormat, binary);
10090
10091 try
10092 {
10093 gl::Context *context = gl::getNonLostContext();
10094
10095 if (context)
10096 {
10097 gl::Program *programObject = context->getProgram(program);
10098
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010099 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010101 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010102 }
10103
10104 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10105
10106 if (!programBinary)
10107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010108 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010109 }
10110
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010111 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010113 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010114 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010115
10116 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010117 }
10118 }
10119 catch(std::bad_alloc&)
10120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010121 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010122 }
10123}
10124
10125void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10126 const void *binary, GLint length)
10127{
10128 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10129 program, binaryFormat, binary, length);
10130
10131 try
10132 {
10133 gl::Context *context = gl::getNonLostContext();
10134
10135 if (context)
10136 {
10137 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010139 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010140 }
10141
10142 gl::Program *programObject = context->getProgram(program);
10143
10144 if (!programObject)
10145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010146 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010147 }
10148
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010149 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010150 }
10151 }
10152 catch(std::bad_alloc&)
10153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010154 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010155 }
10156}
10157
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010158void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10159{
10160 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10161
10162 try
10163 {
10164 gl::Context *context = gl::getNonLostContext();
10165
10166 if (context)
10167 {
10168 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10169 {
10170 return gl::error(GL_INVALID_VALUE);
10171 }
10172
10173 if (context->getDrawFramebufferHandle() == 0)
10174 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010175 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010176 {
10177 return gl::error(GL_INVALID_OPERATION);
10178 }
10179
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010180 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010181 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010182 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010183 }
10184 }
10185 else
10186 {
10187 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10188 {
10189 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10190 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10191 {
10192 return gl::error(GL_INVALID_OPERATION);
10193 }
10194 }
10195 }
10196
10197 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10198
10199 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10200 {
10201 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10202 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010203
10204 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10205 {
10206 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10207 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010208 }
10209 }
10210 catch (std::bad_alloc&)
10211 {
10212 return gl::error(GL_OUT_OF_MEMORY);
10213 }
10214}
10215
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010216__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10217{
10218 struct Extension
10219 {
10220 const char *name;
10221 __eglMustCastToProperFunctionPointerType address;
10222 };
10223
10224 static const Extension glExtensions[] =
10225 {
10226 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010227 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010228 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010229 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10230 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10231 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10232 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10233 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10234 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10235 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010236 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010237 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010238 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10239 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10240 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10241 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010242 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10243 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10244 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10245 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10246 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10247 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10248 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010249 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010250 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10251 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10252 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010253 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10254 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010255
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010256 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010257 {
10258 if (strcmp(procname, glExtensions[ext].name) == 0)
10259 {
10260 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10261 }
10262 }
10263
10264 return NULL;
10265}
10266
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010267// Non-public functions used by EGL
10268
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010269bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010270{
10271 EVENT("(egl::Surface* surface = 0x%0.8p)",
10272 surface);
10273
10274 try
10275 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010276 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010277
10278 if (context)
10279 {
10280 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010281 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010282
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010283 if (textureObject->isImmutable())
10284 {
10285 return false;
10286 }
10287
Geoff Lang32d508e2014-02-11 09:39:48 -050010288 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010289 }
10290 }
10291 catch(std::bad_alloc&)
10292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010293 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010294 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010295
10296 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010297}
10298
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010299}