blob: a671c2275b7c3385ac9b6a71a3aa6029002635c4 [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"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Geoff Lange8ebe7f2013-08-05 15:03:13 -040026#include "libGLESv2/validationES.h"
27#include "libGLESv2/validationES2.h"
28#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050029#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040030
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031extern "C"
32{
33
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000034// OpenGL ES 2.0 functions
35
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036void __stdcall glActiveTexture(GLenum texture)
37{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000038 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039
40 try
41 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000042 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000043
44 if (context)
45 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000046 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
47 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000048 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000049 }
50
daniel@transgaming.com428d1582010-05-04 03:35:25 +000051 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052 }
53 }
54 catch(std::bad_alloc&)
55 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057 }
58}
59
60void __stdcall glAttachShader(GLuint program, GLuint shader)
61{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000062 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000063
64 try
65 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000066 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000067
68 if (context)
69 {
70 gl::Program *programObject = context->getProgram(program);
71 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000072
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000073 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000075 if (context->getShader(program))
76 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000077 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000078 }
79 else
80 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000081 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000082 }
83 }
84
85 if (!shaderObject)
86 {
87 if (context->getProgram(shader))
88 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000089 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000090 }
91 else
92 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000093 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000094 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000095 }
96
97 if (!programObject->attachShader(shaderObject))
98 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000099 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000100 }
101 }
102 }
103 catch(std::bad_alloc&)
104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000105 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106 }
107}
108
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000109void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
110{
111 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
112
113 try
114 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000115 gl::Context *context = gl::getNonLostContext();
116
117 if (context)
118 {
Geoff Lang37dde692014-01-31 16:34:54 -0500119 if (!ValidQueryType(context, target))
120 {
121 return gl::error(GL_INVALID_ENUM);
122 }
123
124 if (id == 0)
125 {
126 return gl::error(GL_INVALID_OPERATION);
127 }
128
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000129 context->beginQuery(target, id);
130 }
131 }
132 catch(std::bad_alloc&)
133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000134 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000135 }
136}
137
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000138void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000139{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000140 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141
142 try
143 {
144 if (index >= gl::MAX_VERTEX_ATTRIBS)
145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000146 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000147 }
148
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000149 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150
151 if (context)
152 {
153 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000154
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155 if (!programObject)
156 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000157 if (context->getShader(program))
158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000159 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000160 }
161 else
162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000163 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000164 }
165 }
166
167 if (strncmp(name, "gl_", 3) == 0)
168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000169 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170 }
171
172 programObject->bindAttributeLocation(index, name);
173 }
174 }
175 catch(std::bad_alloc&)
176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000177 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000178 }
179}
180
181void __stdcall glBindBuffer(GLenum target, GLuint buffer)
182{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000183 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184
185 try
186 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188
189 if (context)
190 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000191 // Check ES3 specific targets
192 switch (target)
193 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000194 case GL_COPY_READ_BUFFER:
195 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000196 case GL_PIXEL_PACK_BUFFER:
197 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000198 case GL_UNIFORM_BUFFER:
199 case GL_TRANSFORM_FEEDBACK_BUFFER:
200 if (context->getClientVersion() < 3)
201 {
202 return gl::error(GL_INVALID_ENUM);
203 }
204 }
205
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000206 switch (target)
207 {
208 case GL_ARRAY_BUFFER:
209 context->bindArrayBuffer(buffer);
210 return;
211 case GL_ELEMENT_ARRAY_BUFFER:
212 context->bindElementArrayBuffer(buffer);
213 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000214 case GL_COPY_READ_BUFFER:
215 context->bindCopyReadBuffer(buffer);
216 return;
217 case GL_COPY_WRITE_BUFFER:
218 context->bindCopyWriteBuffer(buffer);
219 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000220 case GL_PIXEL_PACK_BUFFER:
221 context->bindPixelPackBuffer(buffer);
222 return;
223 case GL_PIXEL_UNPACK_BUFFER:
224 context->bindPixelUnpackBuffer(buffer);
225 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000226 case GL_UNIFORM_BUFFER:
227 context->bindGenericUniformBuffer(buffer);
228 return;
229 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000230 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000231 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000232 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000233 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234 }
235 }
236 }
237 catch(std::bad_alloc&)
238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240 }
241}
242
243void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000245 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246
247 try
248 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500249 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000251 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252 }
253
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255
256 if (context)
257 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000258 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
259 {
260 context->bindReadFramebuffer(framebuffer);
261 }
262
263 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
264 {
265 context->bindDrawFramebuffer(framebuffer);
266 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000267 }
268 }
269 catch(std::bad_alloc&)
270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000271 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000272 }
273}
274
275void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
276{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000277 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278
279 try
280 {
281 if (target != GL_RENDERBUFFER)
282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000283 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000284 }
285
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000286 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287
288 if (context)
289 {
290 context->bindRenderbuffer(renderbuffer);
291 }
292 }
293 catch(std::bad_alloc&)
294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000295 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000296 }
297}
298
299void __stdcall glBindTexture(GLenum target, GLuint texture)
300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000301 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000302
303 try
304 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306
307 if (context)
308 {
309 gl::Texture *textureObject = context->getTexture(texture);
310
311 if (textureObject && textureObject->getTarget() != target && texture != 0)
312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000313 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000314 }
315
316 switch (target)
317 {
318 case GL_TEXTURE_2D:
319 context->bindTexture2D(texture);
320 return;
321 case GL_TEXTURE_CUBE_MAP:
322 context->bindTextureCubeMap(texture);
323 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000324 case GL_TEXTURE_3D:
325 if (context->getClientVersion() < 3)
326 {
327 return gl::error(GL_INVALID_ENUM);
328 }
329 context->bindTexture3D(texture);
330 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000331 case GL_TEXTURE_2D_ARRAY:
332 if (context->getClientVersion() < 3)
333 {
334 return gl::error(GL_INVALID_ENUM);
335 }
336 context->bindTexture2DArray(texture);
337 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000338 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000339 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000340 }
341 }
342 }
343 catch(std::bad_alloc&)
344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000345 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000346 }
347}
348
349void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000351 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000352 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000353
354 try
355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000356 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357
358 if (context)
359 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000360 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000361 }
362 }
363 catch(std::bad_alloc&)
364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000365 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366 }
367}
368
369void __stdcall glBlendEquation(GLenum mode)
370{
371 glBlendEquationSeparate(mode, mode);
372}
373
374void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000376 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377
378 try
379 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000380 gl::Context *context = gl::getNonLostContext();
381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 switch (modeRGB)
383 {
384 case GL_FUNC_ADD:
385 case GL_FUNC_SUBTRACT:
386 case GL_FUNC_REVERSE_SUBTRACT:
387 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388
389 case GL_MIN:
390 case GL_MAX:
391 if (context && context->getClientVersion() < 3)
392 {
393 return gl::error(GL_INVALID_ENUM);
394 }
395 break;
396
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000398 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400
401 switch (modeAlpha)
402 {
403 case GL_FUNC_ADD:
404 case GL_FUNC_SUBTRACT:
405 case GL_FUNC_REVERSE_SUBTRACT:
406 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000407
408 case GL_MIN:
409 case GL_MAX:
410 if (context && context->getClientVersion() < 3)
411 {
412 return gl::error(GL_INVALID_ENUM);
413 }
414 break;
415
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000416 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000417 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418 }
419
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420 if (context)
421 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000422 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000423 }
424 }
425 catch(std::bad_alloc&)
426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000428 }
429}
430
431void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
432{
433 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
434}
435
436void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000438 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 +0000439 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440
441 try
442 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000443 gl::Context *context = gl::getNonLostContext();
444
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000445 switch (srcRGB)
446 {
447 case GL_ZERO:
448 case GL_ONE:
449 case GL_SRC_COLOR:
450 case GL_ONE_MINUS_SRC_COLOR:
451 case GL_DST_COLOR:
452 case GL_ONE_MINUS_DST_COLOR:
453 case GL_SRC_ALPHA:
454 case GL_ONE_MINUS_SRC_ALPHA:
455 case GL_DST_ALPHA:
456 case GL_ONE_MINUS_DST_ALPHA:
457 case GL_CONSTANT_COLOR:
458 case GL_ONE_MINUS_CONSTANT_COLOR:
459 case GL_CONSTANT_ALPHA:
460 case GL_ONE_MINUS_CONSTANT_ALPHA:
461 case GL_SRC_ALPHA_SATURATE:
462 break;
463 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465 }
466
467 switch (dstRGB)
468 {
469 case GL_ZERO:
470 case GL_ONE:
471 case GL_SRC_COLOR:
472 case GL_ONE_MINUS_SRC_COLOR:
473 case GL_DST_COLOR:
474 case GL_ONE_MINUS_DST_COLOR:
475 case GL_SRC_ALPHA:
476 case GL_ONE_MINUS_SRC_ALPHA:
477 case GL_DST_ALPHA:
478 case GL_ONE_MINUS_DST_ALPHA:
479 case GL_CONSTANT_COLOR:
480 case GL_ONE_MINUS_CONSTANT_COLOR:
481 case GL_CONSTANT_ALPHA:
482 case GL_ONE_MINUS_CONSTANT_ALPHA:
483 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000484
485 case GL_SRC_ALPHA_SATURATE:
486 if (!context || context->getClientVersion() < 3)
487 {
488 return gl::error(GL_INVALID_ENUM);
489 }
490 break;
491
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000493 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000494 }
495
496 switch (srcAlpha)
497 {
498 case GL_ZERO:
499 case GL_ONE:
500 case GL_SRC_COLOR:
501 case GL_ONE_MINUS_SRC_COLOR:
502 case GL_DST_COLOR:
503 case GL_ONE_MINUS_DST_COLOR:
504 case GL_SRC_ALPHA:
505 case GL_ONE_MINUS_SRC_ALPHA:
506 case GL_DST_ALPHA:
507 case GL_ONE_MINUS_DST_ALPHA:
508 case GL_CONSTANT_COLOR:
509 case GL_ONE_MINUS_CONSTANT_COLOR:
510 case GL_CONSTANT_ALPHA:
511 case GL_ONE_MINUS_CONSTANT_ALPHA:
512 case GL_SRC_ALPHA_SATURATE:
513 break;
514 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000515 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000516 }
517
518 switch (dstAlpha)
519 {
520 case GL_ZERO:
521 case GL_ONE:
522 case GL_SRC_COLOR:
523 case GL_ONE_MINUS_SRC_COLOR:
524 case GL_DST_COLOR:
525 case GL_ONE_MINUS_DST_COLOR:
526 case GL_SRC_ALPHA:
527 case GL_ONE_MINUS_SRC_ALPHA:
528 case GL_DST_ALPHA:
529 case GL_ONE_MINUS_DST_ALPHA:
530 case GL_CONSTANT_COLOR:
531 case GL_ONE_MINUS_CONSTANT_COLOR:
532 case GL_CONSTANT_ALPHA:
533 case GL_ONE_MINUS_CONSTANT_ALPHA:
534 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000535
536 case GL_SRC_ALPHA_SATURATE:
537 if (!context || context->getClientVersion() < 3)
538 {
539 return gl::error(GL_INVALID_ENUM);
540 }
541 break;
542
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000545 }
546
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000547 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
548 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
549
550 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
551 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
552
553 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000554 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000555 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 +0000556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000557 }
558
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559 if (context)
560 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000561 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000562 }
563 }
564 catch(std::bad_alloc&)
565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000567 }
568}
569
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000570void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000572 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 +0000573 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000574
575 try
576 {
577 if (size < 0)
578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000579 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 }
581
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000582 gl::Context *context = gl::getNonLostContext();
583
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 switch (usage)
585 {
586 case GL_STREAM_DRAW:
587 case GL_STATIC_DRAW:
588 case GL_DYNAMIC_DRAW:
589 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000590
591 case GL_STREAM_READ:
592 case GL_STREAM_COPY:
593 case GL_STATIC_READ:
594 case GL_STATIC_COPY:
595 case GL_DYNAMIC_READ:
596 case GL_DYNAMIC_COPY:
597 if (context && context->getClientVersion() < 3)
598 {
599 return gl::error(GL_INVALID_ENUM);
600 }
601 break;
602
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000603 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000604 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 }
606
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000607 if (context)
608 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000609 // Check ES3 specific targets
610 switch (target)
611 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000612 case GL_COPY_READ_BUFFER:
613 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000614 case GL_PIXEL_PACK_BUFFER:
615 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000616 case GL_UNIFORM_BUFFER:
617 case GL_TRANSFORM_FEEDBACK_BUFFER:
618 if (context->getClientVersion() < 3)
619 {
620 return gl::error(GL_INVALID_ENUM);
621 }
622 }
623
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000624 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000625
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000626 switch (target)
627 {
628 case GL_ARRAY_BUFFER:
629 buffer = context->getArrayBuffer();
630 break;
631 case GL_ELEMENT_ARRAY_BUFFER:
632 buffer = context->getElementArrayBuffer();
633 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000634 case GL_COPY_READ_BUFFER:
635 buffer = context->getCopyReadBuffer();
636 break;
637 case GL_COPY_WRITE_BUFFER:
638 buffer = context->getCopyWriteBuffer();
639 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000640 case GL_PIXEL_PACK_BUFFER:
641 buffer = context->getPixelPackBuffer();
642 break;
643 case GL_PIXEL_UNPACK_BUFFER:
644 buffer = context->getPixelUnpackBuffer();
645 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000646 case GL_TRANSFORM_FEEDBACK_BUFFER:
647 buffer = context->getGenericTransformFeedbackBuffer();
648 break;
649 case GL_UNIFORM_BUFFER:
650 buffer = context->getGenericUniformBuffer();
651 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000652 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 }
655
656 if (!buffer)
657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000658 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 }
660
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000661 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000662 }
663 }
664 catch(std::bad_alloc&)
665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000666 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000667 }
668}
669
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000670void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000672 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 +0000673 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674
675 try
676 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000677 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000680 }
681
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000682 if (data == NULL)
683 {
684 return;
685 }
686
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000687 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000688
689 if (context)
690 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000691 // Check ES3 specific targets
692 switch (target)
693 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000694 case GL_COPY_READ_BUFFER:
695 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000696 case GL_PIXEL_PACK_BUFFER:
697 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000698 case GL_UNIFORM_BUFFER:
699 case GL_TRANSFORM_FEEDBACK_BUFFER:
700 if (context->getClientVersion() < 3)
701 {
702 return gl::error(GL_INVALID_ENUM);
703 }
704 }
705
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000706 gl::Buffer *buffer;
707
708 switch (target)
709 {
710 case GL_ARRAY_BUFFER:
711 buffer = context->getArrayBuffer();
712 break;
713 case GL_ELEMENT_ARRAY_BUFFER:
714 buffer = context->getElementArrayBuffer();
715 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000716 case GL_COPY_READ_BUFFER:
717 buffer = context->getCopyReadBuffer();
718 break;
719 case GL_COPY_WRITE_BUFFER:
720 buffer = context->getCopyWriteBuffer();
721 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000722 case GL_PIXEL_PACK_BUFFER:
723 buffer = context->getPixelPackBuffer();
724 break;
725 case GL_PIXEL_UNPACK_BUFFER:
726 buffer = context->getPixelUnpackBuffer();
727 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000728 case GL_TRANSFORM_FEEDBACK_BUFFER:
729 buffer = context->getGenericTransformFeedbackBuffer();
730 break;
731 case GL_UNIFORM_BUFFER:
732 buffer = context->getGenericUniformBuffer();
733 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000734 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000735 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000736 }
737
738 if (!buffer)
739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000740 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000741 }
742
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000743 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000745 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000746 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000747
748 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000749 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000750 }
751 catch(std::bad_alloc&)
752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000753 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754 }
755}
756
757GLenum __stdcall glCheckFramebufferStatus(GLenum target)
758{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000759 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000760
761 try
762 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500763 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000765 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000766 }
767
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000769
770 if (context)
771 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500772 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
773 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 return framebuffer->completeness();
775 }
776 }
777 catch(std::bad_alloc&)
778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000779 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780 }
781
782 return 0;
783}
784
785void __stdcall glClear(GLbitfield mask)
786{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000787 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000788
789 try
790 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000792
793 if (context)
794 {
Geoff Lang0b833232013-08-21 10:13:29 -0400795 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
796
797 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
798 {
799 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
800 }
801
802 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
803 {
804 return gl::error(GL_INVALID_VALUE);
805 }
806
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000807 context->clear(mask);
808 }
809 }
810 catch(std::bad_alloc&)
811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 }
814}
815
816void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
817{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000818 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000819 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820
821 try
822 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000823 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000824
825 if (context)
826 {
827 context->setClearColor(red, green, blue, alpha);
828 }
829 }
830 catch(std::bad_alloc&)
831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000833 }
834}
835
836void __stdcall glClearDepthf(GLclampf depth)
837{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000838 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000839
840 try
841 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000843
844 if (context)
845 {
846 context->setClearDepth(depth);
847 }
848 }
849 catch(std::bad_alloc&)
850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000852 }
853}
854
855void __stdcall glClearStencil(GLint s)
856{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000857 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000858
859 try
860 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000862
863 if (context)
864 {
865 context->setClearStencil(s);
866 }
867 }
868 catch(std::bad_alloc&)
869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000870 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000871 }
872}
873
874void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
875{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000876 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000877 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000878
879 try
880 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882
883 if (context)
884 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000885 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000886 }
887 }
888 catch(std::bad_alloc&)
889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000890 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 }
892}
893
894void __stdcall glCompileShader(GLuint shader)
895{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000896 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000897
898 try
899 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000900 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901
902 if (context)
903 {
904 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000905
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000906 if (!shaderObject)
907 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000908 if (context->getProgram(shader))
909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000910 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000911 }
912 else
913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000914 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000915 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000916 }
917
918 shaderObject->compile();
919 }
920 }
921 catch(std::bad_alloc&)
922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000924 }
925}
926
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000927void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
928 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000930 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000931 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000932 target, level, internalformat, width, height, border, imageSize, data);
933
934 try
935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000937
938 if (context)
939 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000940 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400941 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000942 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
943 {
944 return;
945 }
946
947 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400948 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400949 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000950 {
951 return;
952 }
953
954 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000957 }
958
959 switch (target)
960 {
961 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000962 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000963 gl::Texture2D *texture = context->getTexture2D();
964 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000965 }
966 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000967
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000968 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
969 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
970 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
971 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
972 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
973 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000974 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 gl::TextureCubeMap *texture = context->getTextureCubeMap();
976 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000977 }
978 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000980 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000981 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000982 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000984 }
985 catch(std::bad_alloc&)
986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000988 }
989}
990
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000991void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
992 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000993{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000994 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000995 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000996 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997 target, level, xoffset, yoffset, width, height, format, imageSize, data);
998
999 try
1000 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001001 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001002
1003 if (context)
1004 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001005 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001006 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001007 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
1008 {
1009 return;
1010 }
1011
1012 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001013 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04001014 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001015 {
1016 return;
1017 }
1018
1019 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001021 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001022 }
1023
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001024 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00001025 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001026 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001027 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001028 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001029 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001030 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001031 break;
1032
1033 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1034 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1035 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1036 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1037 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1038 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001039 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001040 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001041 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001042 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001043 break;
1044
1045 default:
1046 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001047 }
1048 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001049 }
1050 catch(std::bad_alloc&)
1051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001052 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053 }
1054}
1055
1056void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001058 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001059 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001060 target, level, internalformat, x, y, width, height, border);
1061
1062 try
1063 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001064 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001065
1066 if (context)
1067 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001068 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001069 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001070 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001071 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001072 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001073 }
1074
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001075 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001076 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001077 0, 0, 0, x, y, width, height, border))
1078 {
1079 return;
1080 }
1081
1082 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1083
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001084 switch (target)
1085 {
1086 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001087 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001088 gl::Texture2D *texture = context->getTexture2D();
1089 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001090 }
1091 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001092
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001093 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1094 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1095 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1096 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1097 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1098 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001099 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001100 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1101 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001102 }
1103 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001104
1105 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001106 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001107 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001108 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001109 }
1110 catch(std::bad_alloc&)
1111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001112 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001113 }
1114}
1115
1116void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1117{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001118 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001119 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001120 target, level, xoffset, yoffset, x, y, width, height);
1121
1122 try
1123 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001124 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001125
1126 if (context)
1127 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001128 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001129 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001130 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001131 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001132 return;
1133 }
1134
1135 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001136 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001137 xoffset, yoffset, 0, x, y, width, height, 0))
1138 {
1139 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001140 }
1141
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001142 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001143
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001144 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001145 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001146 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001147 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001148 gl::Texture2D *texture = context->getTexture2D();
1149 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001150 }
1151 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001152
1153 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1154 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1155 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1156 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1157 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1158 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001159 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001160 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1161 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001162 }
1163 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001164
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001165 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001166 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001167 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001168 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001170
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001171 catch(std::bad_alloc&)
1172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001174 }
1175}
1176
1177GLuint __stdcall glCreateProgram(void)
1178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001179 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001180
1181 try
1182 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001184
1185 if (context)
1186 {
1187 return context->createProgram();
1188 }
1189 }
1190 catch(std::bad_alloc&)
1191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001192 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001193 }
1194
1195 return 0;
1196}
1197
1198GLuint __stdcall glCreateShader(GLenum type)
1199{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001200 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001201
1202 try
1203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001205
1206 if (context)
1207 {
1208 switch (type)
1209 {
1210 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001211 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001212 return context->createShader(type);
1213 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001214 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001215 }
1216 }
1217 }
1218 catch(std::bad_alloc&)
1219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001220 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001221 }
1222
1223 return 0;
1224}
1225
1226void __stdcall glCullFace(GLenum mode)
1227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001228 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229
1230 try
1231 {
1232 switch (mode)
1233 {
1234 case GL_FRONT:
1235 case GL_BACK:
1236 case GL_FRONT_AND_BACK:
1237 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001238 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001239
1240 if (context)
1241 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001242 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243 }
1244 }
1245 break;
1246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248 }
1249 }
1250 catch(std::bad_alloc&)
1251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001252 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253 }
1254}
1255
1256void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1257{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001258 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001259
1260 try
1261 {
1262 if (n < 0)
1263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001264 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001265 }
1266
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001268
1269 if (context)
1270 {
1271 for (int i = 0; i < n; i++)
1272 {
1273 context->deleteBuffer(buffers[i]);
1274 }
1275 }
1276 }
1277 catch(std::bad_alloc&)
1278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001280 }
1281}
1282
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001283void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001285 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001286
1287 try
1288 {
1289 if (n < 0)
1290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001291 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001292 }
1293
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001294 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001295
1296 if (context)
1297 {
1298 for (int i = 0; i < n; i++)
1299 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001300 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001301 }
1302 }
1303 }
1304 catch(std::bad_alloc&)
1305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001306 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001307 }
1308}
1309
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001312 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001313
1314 try
1315 {
1316 if (n < 0)
1317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319 }
1320
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001322
1323 if (context)
1324 {
1325 for (int i = 0; i < n; i++)
1326 {
1327 if (framebuffers[i] != 0)
1328 {
1329 context->deleteFramebuffer(framebuffers[i]);
1330 }
1331 }
1332 }
1333 }
1334 catch(std::bad_alloc&)
1335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337 }
1338}
1339
1340void __stdcall glDeleteProgram(GLuint program)
1341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001342 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343
1344 try
1345 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001346 if (program == 0)
1347 {
1348 return;
1349 }
1350
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001352
1353 if (context)
1354 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001355 if (!context->getProgram(program))
1356 {
1357 if(context->getShader(program))
1358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001359 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001360 }
1361 else
1362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001364 }
1365 }
1366
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 context->deleteProgram(program);
1368 }
1369 }
1370 catch(std::bad_alloc&)
1371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001372 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373 }
1374}
1375
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001376void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1377{
1378 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1379
1380 try
1381 {
1382 if (n < 0)
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001385 }
1386
1387 gl::Context *context = gl::getNonLostContext();
1388
1389 if (context)
1390 {
1391 for (int i = 0; i < n; i++)
1392 {
1393 context->deleteQuery(ids[i]);
1394 }
1395 }
1396 }
1397 catch(std::bad_alloc&)
1398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001399 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001400 }
1401}
1402
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001403void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1404{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001405 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001406
1407 try
1408 {
1409 if (n < 0)
1410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001412 }
1413
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001415
1416 if (context)
1417 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001418 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419 {
1420 context->deleteRenderbuffer(renderbuffers[i]);
1421 }
1422 }
1423 }
1424 catch(std::bad_alloc&)
1425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001426 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427 }
1428}
1429
1430void __stdcall glDeleteShader(GLuint shader)
1431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001432 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001433
1434 try
1435 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001436 if (shader == 0)
1437 {
1438 return;
1439 }
1440
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442
1443 if (context)
1444 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001445 if (!context->getShader(shader))
1446 {
1447 if(context->getProgram(shader))
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001450 }
1451 else
1452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001453 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001454 }
1455 }
1456
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001457 context->deleteShader(shader);
1458 }
1459 }
1460 catch(std::bad_alloc&)
1461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001462 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463 }
1464}
1465
1466void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1467{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001468 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469
1470 try
1471 {
1472 if (n < 0)
1473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001474 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475 }
1476
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478
1479 if (context)
1480 {
1481 for (int i = 0; i < n; i++)
1482 {
1483 if (textures[i] != 0)
1484 {
1485 context->deleteTexture(textures[i]);
1486 }
1487 }
1488 }
1489 }
1490 catch(std::bad_alloc&)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001493 }
1494}
1495
1496void __stdcall glDepthFunc(GLenum func)
1497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001498 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001499
1500 try
1501 {
1502 switch (func)
1503 {
1504 case GL_NEVER:
1505 case GL_ALWAYS:
1506 case GL_LESS:
1507 case GL_LEQUAL:
1508 case GL_EQUAL:
1509 case GL_GREATER:
1510 case GL_GEQUAL:
1511 case GL_NOTEQUAL:
1512 break;
1513 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001514 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001515 }
1516
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001517 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518
1519 if (context)
1520 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001521 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 }
1523 }
1524 catch(std::bad_alloc&)
1525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001526 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001527 }
1528}
1529
1530void __stdcall glDepthMask(GLboolean flag)
1531{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001532 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533
1534 try
1535 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001537
1538 if (context)
1539 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001540 context->setDepthMask(flag != GL_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 glDepthRangef(GLclampf zNear, GLclampf zFar)
1550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001551 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552
1553 try
1554 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001555 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001556
1557 if (context)
1558 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001559 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001560 }
1561 }
1562 catch(std::bad_alloc&)
1563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001564 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565 }
1566}
1567
1568void __stdcall glDetachShader(GLuint program, GLuint shader)
1569{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001570 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571
1572 try
1573 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001574 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001575
1576 if (context)
1577 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001579 gl::Program *programObject = context->getProgram(program);
1580 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001581
1582 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001584 gl::Shader *shaderByProgramHandle;
1585 shaderByProgramHandle = context->getShader(program);
1586 if (!shaderByProgramHandle)
1587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001588 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001589 }
1590 else
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001593 }
1594 }
1595
1596 if (!shaderObject)
1597 {
1598 gl::Program *programByShaderHandle = context->getProgram(shader);
1599 if (!programByShaderHandle)
1600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001601 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001602 }
1603 else
1604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001605 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001606 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001607 }
1608
1609 if (!programObject->detachShader(shaderObject))
1610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001611 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001613 }
1614 }
1615 catch(std::bad_alloc&)
1616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001617 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001618 }
1619}
1620
1621void __stdcall glDisable(GLenum cap)
1622{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001623 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001624
1625 try
1626 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628
1629 if (context)
1630 {
Geoff Lang0550d032014-01-30 11:29:07 -05001631 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001634 }
Geoff Lang0550d032014-01-30 11:29:07 -05001635
1636 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001637 }
1638 }
1639 catch(std::bad_alloc&)
1640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001642 }
1643}
1644
1645void __stdcall glDisableVertexAttribArray(GLuint index)
1646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001647 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001648
1649 try
1650 {
1651 if (index >= gl::MAX_VERTEX_ATTRIBS)
1652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001654 }
1655
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657
1658 if (context)
1659 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001660 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661 }
1662 }
1663 catch(std::bad_alloc&)
1664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001665 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666 }
1667}
1668
1669void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001671 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001672
1673 try
1674 {
1675 if (count < 0 || first < 0)
1676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001678 }
1679
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001681
1682 if (context)
1683 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001684 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685 }
1686 }
1687 catch(std::bad_alloc&)
1688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001689 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001690 }
1691}
1692
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001693void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1694{
1695 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1696
1697 try
1698 {
1699 if (count < 0 || first < 0 || primcount < 0)
1700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001701 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001702 }
1703
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001704 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001705 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001706 gl::Context *context = gl::getNonLostContext();
1707
1708 if (context)
1709 {
1710 context->drawArrays(mode, first, count, primcount);
1711 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001712 }
1713 }
1714 catch(std::bad_alloc&)
1715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001717 }
1718}
1719
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001720void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001722 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 +00001723 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724
1725 try
1726 {
1727 if (count < 0)
1728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001729 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001730 }
1731
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001733
1734 if (context)
1735 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001736 switch (type)
1737 {
1738 case GL_UNSIGNED_BYTE:
1739 case GL_UNSIGNED_SHORT:
1740 break;
1741 case GL_UNSIGNED_INT:
1742 if (!context->supports32bitIndices())
1743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001744 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001745 }
1746 break;
1747 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001748 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001749 }
1750
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001751 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001752 }
1753 }
1754 catch(std::bad_alloc&)
1755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001757 }
1758}
1759
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001760void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1761{
1762 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1763 mode, count, type, indices, primcount);
1764
1765 try
1766 {
1767 if (count < 0 || primcount < 0)
1768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001769 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001770 }
1771
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001772 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001773 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001774 gl::Context *context = gl::getNonLostContext();
1775
1776 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001777 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001778 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001779 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001780 case GL_UNSIGNED_BYTE:
1781 case GL_UNSIGNED_SHORT:
1782 break;
1783 case GL_UNSIGNED_INT:
1784 if (!context->supports32bitIndices())
1785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001786 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001787 }
1788 break;
1789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001791 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001792
1793 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001794 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001795 }
1796 }
1797 catch(std::bad_alloc&)
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001800 }
1801}
1802
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803void __stdcall glEnable(GLenum cap)
1804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001805 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001806
1807 try
1808 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001809 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810
1811 if (context)
1812 {
Geoff Lang0550d032014-01-30 11:29:07 -05001813 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001816 }
Geoff Lang0550d032014-01-30 11:29:07 -05001817
1818 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819 }
1820 }
1821 catch(std::bad_alloc&)
1822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001824 }
1825}
1826
1827void __stdcall glEnableVertexAttribArray(GLuint index)
1828{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001829 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001830
1831 try
1832 {
1833 if (index >= gl::MAX_VERTEX_ATTRIBS)
1834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836 }
1837
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839
1840 if (context)
1841 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001842 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843 }
1844 }
1845 catch(std::bad_alloc&)
1846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001847 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001848 }
1849}
1850
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001851void __stdcall glEndQueryEXT(GLenum target)
1852{
1853 EVENT("GLenum target = 0x%X)", target);
1854
1855 try
1856 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001857 gl::Context *context = gl::getNonLostContext();
1858
1859 if (context)
1860 {
Geoff Lang37dde692014-01-31 16:34:54 -05001861 if (!ValidQueryType(context, target))
1862 {
1863 return gl::error(GL_INVALID_ENUM);
1864 }
1865
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001866 context->endQuery(target);
1867 }
1868 }
1869 catch(std::bad_alloc&)
1870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001872 }
1873}
1874
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001875void __stdcall glFinishFenceNV(GLuint fence)
1876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001877 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001878
1879 try
1880 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001881 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001882
1883 if (context)
1884 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001885 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001886
1887 if (fenceObject == NULL)
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001890 }
1891
Jamie Madillfb9a7402013-07-26 11:55:01 -04001892 if (fenceObject->isFence() != GL_TRUE)
1893 {
1894 return gl::error(GL_INVALID_OPERATION);
1895 }
1896
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001897 fenceObject->finishFence();
1898 }
1899 }
1900 catch(std::bad_alloc&)
1901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001903 }
1904}
1905
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906void __stdcall glFinish(void)
1907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001908 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001909
1910 try
1911 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001912 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001913
1914 if (context)
1915 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001916 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917 }
1918 }
1919 catch(std::bad_alloc&)
1920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001921 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922 }
1923}
1924
1925void __stdcall glFlush(void)
1926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001927 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001928
1929 try
1930 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001931 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001932
1933 if (context)
1934 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001935 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001936 }
1937 }
1938 catch(std::bad_alloc&)
1939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001940 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001941 }
1942}
1943
1944void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001946 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001947 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001948
1949 try
1950 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001951 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957
1958 if (context)
1959 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001960 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001961 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001962 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001963 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001965 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1966 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001968 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001969 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001970 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001971 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001972 }
1973 else
1974 {
1975 switch (attachment)
1976 {
1977 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001978 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001979 break;
1980 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001981 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001982 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001983 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001984 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1985 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001986 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001987 UNREACHABLE();
1988 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990 }
1991 }
1992 }
1993 catch(std::bad_alloc&)
1994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996 }
1997}
1998
1999void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2000{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002001 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002002 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002003
2004 try
2005 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002006 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007 if (context)
2008 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002009 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002010 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002011 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002012 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002013 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04002014
2015 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04002016 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002017 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04002018 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002019 }
2020
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002021 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002022 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002023 textarget = GL_NONE;
2024 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002025
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002026 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002028 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002029 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002030 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04002031 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002032 }
2033 else
2034 {
2035 switch (attachment)
2036 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002037 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2038 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2039 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002040 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002041 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002042 }
2043 }
2044 catch(std::bad_alloc&)
2045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002046 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 }
2048}
2049
2050void __stdcall glFrontFace(GLenum mode)
2051{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002052 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053
2054 try
2055 {
2056 switch (mode)
2057 {
2058 case GL_CW:
2059 case GL_CCW:
2060 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002061 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002062
2063 if (context)
2064 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002065 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 }
2067 }
2068 break;
2069 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002071 }
2072 }
2073 catch(std::bad_alloc&)
2074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002076 }
2077}
2078
2079void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002081 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002082
2083 try
2084 {
2085 if (n < 0)
2086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002087 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002088 }
2089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091
2092 if (context)
2093 {
2094 for (int i = 0; i < n; i++)
2095 {
2096 buffers[i] = context->createBuffer();
2097 }
2098 }
2099 }
2100 catch(std::bad_alloc&)
2101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103 }
2104}
2105
2106void __stdcall glGenerateMipmap(GLenum target)
2107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002108 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002109
2110 try
2111 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002112 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002113
2114 if (context)
2115 {
Jamie Madill35d15012013-10-07 10:46:37 -04002116 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002118 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002119 }
Geoff Langae4852a2013-06-05 15:00:34 -04002120
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002121 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002122
2123 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002124 {
2125 return gl::error(GL_INVALID_OPERATION);
2126 }
2127
Geoff Lang005df412013-10-16 14:12:50 -04002128 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002129
Geoff Langae4852a2013-06-05 15:00:34 -04002130 // Internally, all texture formats are sized so checking if the format
2131 // is color renderable and filterable will not fail.
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002132 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2133 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Geoff Langae4852a2013-06-05 15:00:34 -04002134 !gl::IsColorRenderingSupported(internalFormat, context) ||
2135 !gl::IsTextureFilteringSupported(internalFormat, context))
2136 {
2137 return gl::error(GL_INVALID_OPERATION);
2138 }
2139
Jamie Madillc1f8b162013-10-07 10:46:38 -04002140 // Non-power of 2 ES2 check
2141 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2142 {
2143 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2144 return gl::error(GL_INVALID_OPERATION);
2145 }
2146
2147 // Cube completeness check
2148 if (target == GL_TEXTURE_CUBE_MAP)
2149 {
2150 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2151 if (!textureCube->isCubeComplete())
2152 {
2153 return gl::error(GL_INVALID_OPERATION);
2154 }
2155 }
2156
Geoff Langae4852a2013-06-05 15:00:34 -04002157 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002158 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159 }
2160 catch(std::bad_alloc&)
2161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002162 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163 }
2164}
2165
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002166void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2167{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002168 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002169
2170 try
2171 {
2172 if (n < 0)
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002175 }
2176
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002177 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002178
2179 if (context)
2180 {
2181 for (int i = 0; i < n; i++)
2182 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002183 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002184 }
2185 }
2186 }
2187 catch(std::bad_alloc&)
2188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002189 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002190 }
2191}
2192
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002193void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2194{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002195 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002196
2197 try
2198 {
2199 if (n < 0)
2200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002201 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002202 }
2203
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002205
2206 if (context)
2207 {
2208 for (int i = 0; i < n; i++)
2209 {
2210 framebuffers[i] = context->createFramebuffer();
2211 }
2212 }
2213 }
2214 catch(std::bad_alloc&)
2215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002216 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002217 }
2218}
2219
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002220void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2221{
2222 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2223
2224 try
2225 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002226 gl::Context *context = gl::getNonLostContext();
2227
2228 if (context)
2229 {
Geoff Lang37dde692014-01-31 16:34:54 -05002230 if (n < 0)
2231 {
2232 return gl::error(GL_INVALID_VALUE);
2233 }
2234
2235 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002236 {
2237 ids[i] = context->createQuery();
2238 }
2239 }
2240 }
2241 catch(std::bad_alloc&)
2242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002244 }
2245}
2246
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002247void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002249 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002250
2251 try
2252 {
2253 if (n < 0)
2254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002256 }
2257
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259
2260 if (context)
2261 {
2262 for (int i = 0; i < n; i++)
2263 {
2264 renderbuffers[i] = context->createRenderbuffer();
2265 }
2266 }
2267 }
2268 catch(std::bad_alloc&)
2269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002270 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271 }
2272}
2273
2274void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2275{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002276 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002277
2278 try
2279 {
2280 if (n < 0)
2281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002283 }
2284
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286
2287 if (context)
2288 {
2289 for (int i = 0; i < n; i++)
2290 {
2291 textures[i] = context->createTexture();
2292 }
2293 }
2294 }
2295 catch(std::bad_alloc&)
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002298 }
2299}
2300
daniel@transgaming.com85423182010-04-22 13:35:27 +00002301void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002303 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002304 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305 program, index, bufsize, length, size, type, name);
2306
2307 try
2308 {
2309 if (bufsize < 0)
2310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002311 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 }
2313
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002314 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002315
2316 if (context)
2317 {
2318 gl::Program *programObject = context->getProgram(program);
2319
2320 if (!programObject)
2321 {
2322 if (context->getShader(program))
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002325 }
2326 else
2327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002328 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002329 }
2330 }
2331
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002332 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002335 }
2336
2337 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2338 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002339 }
2340 catch(std::bad_alloc&)
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343 }
2344}
2345
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002346void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002348 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002349 "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 +00002350 program, index, bufsize, length, size, type, name);
2351
2352 try
2353 {
2354 if (bufsize < 0)
2355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002359 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002360
2361 if (context)
2362 {
2363 gl::Program *programObject = context->getProgram(program);
2364
2365 if (!programObject)
2366 {
2367 if (context->getShader(program))
2368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002370 }
2371 else
2372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002374 }
2375 }
2376
2377 if (index >= (GLuint)programObject->getActiveUniformCount())
2378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002380 }
2381
2382 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2383 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385 catch(std::bad_alloc&)
2386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002387 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388 }
2389}
2390
2391void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2392{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002393 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 +00002394 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395
2396 try
2397 {
2398 if (maxcount < 0)
2399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002400 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401 }
2402
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002403 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002404
2405 if (context)
2406 {
2407 gl::Program *programObject = context->getProgram(program);
2408
2409 if (!programObject)
2410 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002411 if (context->getShader(program))
2412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002414 }
2415 else
2416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002418 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002419 }
2420
2421 return programObject->getAttachedShaders(maxcount, count, shaders);
2422 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424 catch(std::bad_alloc&)
2425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002426 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427 }
2428}
2429
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002430int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002432 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433
2434 try
2435 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002436 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437
2438 if (context)
2439 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002441 gl::Program *programObject = context->getProgram(program);
2442
2443 if (!programObject)
2444 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002445 if (context->getShader(program))
2446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002447 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002448 }
2449 else
2450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002451 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453 }
2454
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002455 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002456 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002458 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002459 }
2460
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002461 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002462 }
2463 }
2464 catch(std::bad_alloc&)
2465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002466 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468
2469 return -1;
2470}
2471
2472void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002474 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475
2476 try
2477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002479
2480 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002482 GLenum nativeType;
2483 unsigned int numParams = 0;
2484 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2485 return gl::error(GL_INVALID_ENUM);
2486
2487 // pname is valid, but there are no parameters to return
2488 if (numParams == 0)
2489 return;
2490
2491 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002492 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002493 context->getBooleanv(pname, params);
2494 }
Jamie Madill55856b12014-01-02 13:59:50 -05002495 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002496 {
Jamie Madill55856b12014-01-02 13:59:50 -05002497 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002498 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002499 }
2500 }
2501 catch(std::bad_alloc&)
2502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002503 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504 }
2505}
2506
2507void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2508{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002509 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 +00002510
2511 try
2512 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002514
2515 if (context)
2516 {
2517 gl::Buffer *buffer;
2518
2519 switch (target)
2520 {
2521 case GL_ARRAY_BUFFER:
2522 buffer = context->getArrayBuffer();
2523 break;
2524 case GL_ELEMENT_ARRAY_BUFFER:
2525 buffer = context->getElementArrayBuffer();
2526 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002527 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002528 }
2529
2530 if (!buffer)
2531 {
2532 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002534 }
2535
2536 switch (pname)
2537 {
2538 case GL_BUFFER_USAGE:
2539 *params = buffer->usage();
2540 break;
2541 case GL_BUFFER_SIZE:
2542 *params = buffer->size();
2543 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002544 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002545 }
2546 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002547 }
2548 catch(std::bad_alloc&)
2549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002550 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002551 }
2552}
2553
2554GLenum __stdcall glGetError(void)
2555{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002556 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002557
2558 gl::Context *context = gl::getContext();
2559
2560 if (context)
2561 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002562 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002563 }
2564
2565 return GL_NO_ERROR;
2566}
2567
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002568void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2569{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002570 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002571
2572 try
2573 {
2574
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002575 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002576
2577 if (context)
2578 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002579 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002580
2581 if (fenceObject == NULL)
2582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002584 }
2585
Jamie Madillfb9a7402013-07-26 11:55:01 -04002586 if (fenceObject->isFence() != GL_TRUE)
2587 {
2588 return gl::error(GL_INVALID_OPERATION);
2589 }
2590
2591 switch (pname)
2592 {
2593 case GL_FENCE_STATUS_NV:
2594 case GL_FENCE_CONDITION_NV:
2595 break;
2596
2597 default: return gl::error(GL_INVALID_ENUM);
2598 }
2599
2600 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002601 }
2602 }
2603 catch(std::bad_alloc&)
2604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002605 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002606 }
2607}
2608
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002611 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002612
2613 try
2614 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002615 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002616
2617 if (context)
2618 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002619 GLenum nativeType;
2620 unsigned int numParams = 0;
2621 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2622 return gl::error(GL_INVALID_ENUM);
2623
2624 // pname is valid, but that there are no parameters to return.
2625 if (numParams == 0)
2626 return;
2627
2628 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002629 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002630 context->getFloatv(pname, params);
2631 }
Jamie Madill55856b12014-01-02 13:59:50 -05002632 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002633 {
Jamie Madill55856b12014-01-02 13:59:50 -05002634 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002635 }
2636 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637 }
2638 catch(std::bad_alloc&)
2639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002641 }
2642}
2643
2644void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002646 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 +00002647 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648
2649 try
2650 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002651 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002652
2653 if (context)
2654 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002655 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002657 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002658 }
2659
Geoff Lang646559f2013-08-15 11:08:15 -04002660 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002661 {
Geoff Lang646559f2013-08-15 11:08:15 -04002662 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2663 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2664 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2665 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2666 break;
2667 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2668 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2669 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2670 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2671 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2672 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2673 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2674 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2675 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2676 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002677 {
Geoff Lang646559f2013-08-15 11:08:15 -04002678 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002679 }
Geoff Lang646559f2013-08-15 11:08:15 -04002680 default:
2681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002682 }
Geoff Lang646559f2013-08-15 11:08:15 -04002683
2684 // Determine if the attachment is a valid enum
2685 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002686 {
Geoff Lang646559f2013-08-15 11:08:15 -04002687 case GL_BACK:
2688 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002689 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002690 case GL_STENCIL:
2691 case GL_DEPTH_STENCIL_ATTACHMENT:
2692 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002693 {
Geoff Lang646559f2013-08-15 11:08:15 -04002694 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002695 }
Geoff Lang646559f2013-08-15 11:08:15 -04002696 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002697
Geoff Lang646559f2013-08-15 11:08:15 -04002698 case GL_DEPTH_ATTACHMENT:
2699 case GL_STENCIL_ATTACHMENT:
2700 break;
2701
2702 default:
2703 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2704 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2705 {
2706 return gl::error(GL_INVALID_ENUM);
2707 }
2708 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002709 }
2710
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002711 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2712 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002713 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2714
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002715 GLenum attachmentType;
2716 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002717 GLuint attachmentLevel;
2718 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002719 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002720
Geoff Lang646559f2013-08-15 11:08:15 -04002721 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002722 {
Geoff Lang646559f2013-08-15 11:08:15 -04002723 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002724 {
Geoff Lang646559f2013-08-15 11:08:15 -04002725 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002726 }
2727
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002728 switch (attachment)
2729 {
Geoff Lang646559f2013-08-15 11:08:15 -04002730 case GL_BACK:
2731 attachmentType = framebuffer->getColorbufferType(0);
2732 attachmentHandle = framebuffer->getColorbufferHandle(0);
2733 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2734 attachmentLayer = framebuffer->getColorbufferLayer(0);
2735 renderbuffer = framebuffer->getColorbuffer(0);
2736 break;
2737 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002738 attachmentType = framebuffer->getDepthbufferType();
2739 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002740 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2741 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002742 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002743 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002744 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002745 attachmentType = framebuffer->getStencilbufferType();
2746 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002747 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2748 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002749 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002750 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002751 default:
2752 return gl::error(GL_INVALID_OPERATION);
2753 }
2754 }
2755 else
2756 {
2757 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2758 {
2759 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2760 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2761 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2762 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2763 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2764 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2765 }
2766 else
2767 {
2768 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002769 {
Geoff Lang646559f2013-08-15 11:08:15 -04002770 case GL_DEPTH_ATTACHMENT:
2771 attachmentType = framebuffer->getDepthbufferType();
2772 attachmentHandle = framebuffer->getDepthbufferHandle();
2773 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2774 attachmentLayer = framebuffer->getDepthbufferLayer();
2775 renderbuffer = framebuffer->getDepthbuffer();
2776 break;
2777 case GL_STENCIL_ATTACHMENT:
2778 attachmentType = framebuffer->getStencilbufferType();
2779 attachmentHandle = framebuffer->getStencilbufferHandle();
2780 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2781 attachmentLayer = framebuffer->getStencilbufferLayer();
2782 renderbuffer = framebuffer->getStencilbuffer();
2783 break;
2784 case GL_DEPTH_STENCIL_ATTACHMENT:
2785 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2786 {
2787 return gl::error(GL_INVALID_OPERATION);
2788 }
2789 attachmentType = framebuffer->getDepthStencilbufferType();
2790 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2791 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2792 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2793 renderbuffer = framebuffer->getDepthStencilBuffer();
2794 break;
2795 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002796 return gl::error(GL_INVALID_OPERATION);
2797 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002798 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002799 }
2800
2801 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002802 if (framebufferHandle == 0)
2803 {
2804 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2805 }
2806 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002807 {
2808 attachmentObjectType = attachmentType;
2809 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002810 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002811 {
2812 attachmentObjectType = GL_TEXTURE;
2813 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002814 else
2815 {
2816 UNREACHABLE();
2817 return;
2818 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002819
Geoff Lang646559f2013-08-15 11:08:15 -04002820 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002821 {
Geoff Lang646559f2013-08-15 11:08:15 -04002822 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2823 // is NONE, then querying any other pname will generate INVALID_ENUM.
2824
2825 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2826 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2827 // INVALID_OPERATION for all other pnames
2828
2829 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002830 {
Geoff Lang646559f2013-08-15 11:08:15 -04002831 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2832 *params = attachmentObjectType;
2833 break;
2834
2835 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2836 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002837 {
Geoff Lang646559f2013-08-15 11:08:15 -04002838 return gl::error(GL_INVALID_ENUM);
2839 }
2840 *params = 0;
2841 break;
2842
2843 default:
2844 if (context->getClientVersion() < 3)
2845 {
2846 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002847 }
2848 else
2849 {
Geoff Lang646559f2013-08-15 11:08:15 -04002850 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002851 }
2852 }
Geoff Lang646559f2013-08-15 11:08:15 -04002853 }
2854 else
2855 {
2856 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2857 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2858 ASSERT(renderbuffer != NULL);
2859
2860 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002861 {
Geoff Lang646559f2013-08-15 11:08:15 -04002862 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2863 *params = attachmentObjectType;
2864 break;
2865
2866 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2867 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2868 {
2869 return gl::error(GL_INVALID_ENUM);
2870 }
2871 *params = attachmentHandle;
2872 break;
2873
2874 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2875 if (attachmentObjectType != GL_TEXTURE)
2876 {
2877 return gl::error(GL_INVALID_ENUM);
2878 }
2879 *params = attachmentLevel;
2880 break;
2881
2882 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2883 if (attachmentObjectType != GL_TEXTURE)
2884 {
2885 return gl::error(GL_INVALID_ENUM);
2886 }
2887 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2888 break;
2889
2890 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2891 *params = renderbuffer->getRedSize();
2892 break;
2893
2894 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2895 *params = renderbuffer->getGreenSize();
2896 break;
2897
2898 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2899 *params = renderbuffer->getBlueSize();
2900 break;
2901
2902 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2903 *params = renderbuffer->getAlphaSize();
2904 break;
2905
2906 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2907 *params = renderbuffer->getDepthSize();
2908 break;
2909
2910 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2911 *params = renderbuffer->getStencilSize();
2912 break;
2913
2914 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2915 if (attachment == GL_DEPTH_STENCIL)
2916 {
2917 gl::error(GL_INVALID_OPERATION);
2918 }
2919 *params = renderbuffer->getComponentType();
2920 break;
2921
2922 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2923 *params = renderbuffer->getColorEncoding();
2924 break;
2925
2926 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2927 if (attachmentObjectType != GL_TEXTURE)
2928 {
2929 return gl::error(GL_INVALID_ENUM);
2930 }
2931 *params = attachmentLayer;
2932 break;
2933
2934 default:
2935 UNREACHABLE();
2936 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002937 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002938 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939 }
2940 }
2941 catch(std::bad_alloc&)
2942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 }
2945}
2946
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002947GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2948{
2949 EVENT("()");
2950
2951 try
2952 {
2953 gl::Context *context = gl::getContext();
2954
2955 if (context)
2956 {
2957 return context->getResetStatus();
2958 }
2959
2960 return GL_NO_ERROR;
2961 }
2962 catch(std::bad_alloc&)
2963 {
2964 return GL_OUT_OF_MEMORY;
2965 }
2966}
2967
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2969{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002970 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002971
2972 try
2973 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002974 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002975
2976 if (context)
2977 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002978 GLenum nativeType;
2979 unsigned int numParams = 0;
2980 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2981 return gl::error(GL_INVALID_ENUM);
2982
2983 // pname is valid, but there are no parameters to return
2984 if (numParams == 0)
2985 return;
2986
2987 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002988 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002989 context->getIntegerv(pname, params);
2990 }
Jamie Madill55856b12014-01-02 13:59:50 -05002991 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002992 {
Jamie Madill55856b12014-01-02 13:59:50 -05002993 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994 }
2995 }
2996 }
2997 catch(std::bad_alloc&)
2998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002999 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000 }
3001}
3002
3003void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3004{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003005 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003006
3007 try
3008 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003009 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003010
3011 if (context)
3012 {
3013 gl::Program *programObject = context->getProgram(program);
3014
3015 if (!programObject)
3016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 }
3019
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003020 if (context->getClientVersion() < 3)
3021 {
3022 switch (pname)
3023 {
3024 case GL_ACTIVE_UNIFORM_BLOCKS:
3025 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3026 return gl::error(GL_INVALID_ENUM);
3027 }
3028 }
3029
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030 switch (pname)
3031 {
3032 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003033 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 return;
3035 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003036 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037 return;
3038 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003039 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003040 return;
3041 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003042 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003043 return;
3044 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003045 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003046 return;
3047 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003048 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003049 return;
3050 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003051 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003052 return;
3053 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003054 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 return;
3056 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003057 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003058 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003059 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003060 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003061 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003062 case GL_ACTIVE_UNIFORM_BLOCKS:
3063 *params = programObject->getActiveUniformBlockCount();
3064 return;
3065 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3066 *params = programObject->getActiveUniformBlockMaxLength();
3067 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003068 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003069 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003070 }
3071 }
3072 }
3073 catch(std::bad_alloc&)
3074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 }
3077}
3078
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003079void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003081 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 +00003082 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003083
3084 try
3085 {
3086 if (bufsize < 0)
3087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003088 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003089 }
3090
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003092
3093 if (context)
3094 {
3095 gl::Program *programObject = context->getProgram(program);
3096
3097 if (!programObject)
3098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003099 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003100 }
3101
3102 programObject->getInfoLog(bufsize, length, infolog);
3103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104 }
3105 catch(std::bad_alloc&)
3106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108 }
3109}
3110
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003111void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3112{
3113 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3114
3115 try
3116 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003117 gl::Context *context = gl::getNonLostContext();
3118
3119 if (context)
3120 {
Geoff Lang37dde692014-01-31 16:34:54 -05003121 if (!ValidQueryType(context, target))
3122 {
3123 return gl::error(GL_INVALID_ENUM);
3124 }
3125
3126 switch (pname)
3127 {
3128 case GL_CURRENT_QUERY_EXT:
3129 params[0] = context->getActiveQuery(target);
3130 break;
3131
3132 default:
3133 return gl::error(GL_INVALID_ENUM);
3134 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003135 }
3136 }
3137 catch(std::bad_alloc&)
3138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003139 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140 }
3141}
3142
3143void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3144{
3145 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3146
3147 try
3148 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003149 gl::Context *context = gl::getNonLostContext();
3150
3151 if (context)
3152 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003153 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3154
3155 if (!queryObject)
3156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003158 }
3159
3160 if (context->getActiveQuery(queryObject->getType()) == id)
3161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003162 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003163 }
3164
3165 switch(pname)
3166 {
3167 case GL_QUERY_RESULT_EXT:
3168 params[0] = queryObject->getResult();
3169 break;
3170 case GL_QUERY_RESULT_AVAILABLE_EXT:
3171 params[0] = queryObject->isResultAvailable();
3172 break;
3173 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003174 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003175 }
3176 }
3177 }
3178 catch(std::bad_alloc&)
3179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003180 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003181 }
3182}
3183
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003184void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3185{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003186 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 +00003187
3188 try
3189 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003190 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003191
3192 if (context)
3193 {
3194 if (target != GL_RENDERBUFFER)
3195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003196 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003197 }
3198
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003199 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003201 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003202 }
3203
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003204 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003205
3206 switch (pname)
3207 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003208 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3209 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3210 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3211 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3212 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3213 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3214 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3215 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3216 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003217 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003218 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003219 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003220 *params = renderbuffer->getSamples();
3221 }
3222 else
3223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003224 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003225 }
3226 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003227 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003228 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003229 }
3230 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231 }
3232 catch(std::bad_alloc&)
3233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003235 }
3236}
3237
3238void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003240 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241
3242 try
3243 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003244 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003245
3246 if (context)
3247 {
3248 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003249
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250 if (!shaderObject)
3251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003252 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253 }
3254
3255 switch (pname)
3256 {
3257 case GL_SHADER_TYPE:
3258 *params = shaderObject->getType();
3259 return;
3260 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003261 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 return;
3263 case GL_COMPILE_STATUS:
3264 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3265 return;
3266 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003267 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 return;
3269 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003270 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003272 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3273 *params = shaderObject->getTranslatedSourceLength();
3274 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277 }
3278 }
3279 }
3280 catch(std::bad_alloc&)
3281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 }
3284}
3285
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003286void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003288 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 +00003289 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290
3291 try
3292 {
3293 if (bufsize < 0)
3294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003295 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003296 }
3297
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003298 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003299
3300 if (context)
3301 {
3302 gl::Shader *shaderObject = context->getShader(shader);
3303
3304 if (!shaderObject)
3305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003307 }
3308
3309 shaderObject->getInfoLog(bufsize, length, infolog);
3310 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003311 }
3312 catch(std::bad_alloc&)
3313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003314 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315 }
3316}
3317
3318void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003320 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 +00003321 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322
3323 try
3324 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003325 switch (shadertype)
3326 {
3327 case GL_VERTEX_SHADER:
3328 case GL_FRAGMENT_SHADER:
3329 break;
3330 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003331 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003332 }
3333
3334 switch (precisiontype)
3335 {
3336 case GL_LOW_FLOAT:
3337 case GL_MEDIUM_FLOAT:
3338 case GL_HIGH_FLOAT:
3339 // Assume IEEE 754 precision
3340 range[0] = 127;
3341 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003342 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003343 break;
3344 case GL_LOW_INT:
3345 case GL_MEDIUM_INT:
3346 case GL_HIGH_INT:
3347 // Some (most) hardware only supports single-precision floating-point numbers,
3348 // which can accurately represent integers up to +/-16777216
3349 range[0] = 24;
3350 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003351 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003352 break;
3353 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003355 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356 }
3357 catch(std::bad_alloc&)
3358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003359 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
3361}
3362
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003363void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003365 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 +00003366 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367
3368 try
3369 {
3370 if (bufsize < 0)
3371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003372 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003373 }
3374
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003376
3377 if (context)
3378 {
3379 gl::Shader *shaderObject = context->getShader(shader);
3380
3381 if (!shaderObject)
3382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003383 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003384 }
3385
3386 shaderObject->getSource(bufsize, length, source);
3387 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003388 }
3389 catch(std::bad_alloc&)
3390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003391 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003392 }
3393}
3394
zmo@google.coma574f782011-10-03 21:45:23 +00003395void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3396{
3397 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3398 shader, bufsize, length, source);
3399
3400 try
3401 {
3402 if (bufsize < 0)
3403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003404 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003405 }
3406
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003407 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003408
3409 if (context)
3410 {
3411 gl::Shader *shaderObject = context->getShader(shader);
3412
3413 if (!shaderObject)
3414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003415 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003416 }
3417
3418 shaderObject->getTranslatedSource(bufsize, length, source);
3419 }
3420 }
3421 catch(std::bad_alloc&)
3422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003423 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003424 }
3425}
3426
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427const GLubyte* __stdcall glGetString(GLenum name)
3428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003429 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430
3431 try
3432 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003433 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003434
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003435 switch (name)
3436 {
3437 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003438 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003439 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003440 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003442 if (context->getClientVersion() == 2)
3443 {
3444 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
3445 }
3446 else
3447 {
3448 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
3449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003451 if (context->getClientVersion() == 2)
3452 {
3453 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
3454 }
3455 else
3456 {
3457 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
3458 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003460 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003462 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003463 }
3464 }
3465 catch(std::bad_alloc&)
3466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003467 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003468 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469}
3470
3471void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003473 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 +00003474
3475 try
3476 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003478
3479 if (context)
3480 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003481 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003482
Jamie Madillfb8a8302013-07-03 14:24:12 -04003483 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003486 }
3487
3488 switch (pname)
3489 {
3490 case GL_TEXTURE_MAG_FILTER:
3491 *params = (GLfloat)texture->getMagFilter();
3492 break;
3493 case GL_TEXTURE_MIN_FILTER:
3494 *params = (GLfloat)texture->getMinFilter();
3495 break;
3496 case GL_TEXTURE_WRAP_S:
3497 *params = (GLfloat)texture->getWrapS();
3498 break;
3499 case GL_TEXTURE_WRAP_T:
3500 *params = (GLfloat)texture->getWrapT();
3501 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003502 case GL_TEXTURE_WRAP_R:
3503 if (context->getClientVersion() < 3)
3504 {
3505 return gl::error(GL_INVALID_ENUM);
3506 }
3507 *params = (GLfloat)texture->getWrapR();
3508 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003509 case GL_TEXTURE_IMMUTABLE_FORMAT:
3510 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003511 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3512 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003513 case GL_TEXTURE_IMMUTABLE_LEVELS:
3514 if (context->getClientVersion() < 3)
3515 {
3516 return gl::error(GL_INVALID_ENUM);
3517 }
Jamie Madill51a94372013-10-24 17:49:43 -04003518 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003519 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003520 case GL_TEXTURE_USAGE_ANGLE:
3521 *params = (GLfloat)texture->getUsage();
3522 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003523 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3524 if (!context->supportsTextureFilterAnisotropy())
3525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003526 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003527 }
3528 *params = (GLfloat)texture->getMaxAnisotropy();
3529 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003530 case GL_TEXTURE_SWIZZLE_R:
3531 if (context->getClientVersion() < 3)
3532 {
3533 return gl::error(GL_INVALID_ENUM);
3534 }
3535 *params = (GLfloat)texture->getSwizzleRed();
3536 break;
3537 case GL_TEXTURE_SWIZZLE_G:
3538 if (context->getClientVersion() < 3)
3539 {
3540 return gl::error(GL_INVALID_ENUM);
3541 }
3542 *params = (GLfloat)texture->getSwizzleGreen();
3543 break;
3544 case GL_TEXTURE_SWIZZLE_B:
3545 if (context->getClientVersion() < 3)
3546 {
3547 return gl::error(GL_INVALID_ENUM);
3548 }
3549 *params = (GLfloat)texture->getSwizzleBlue();
3550 break;
3551 case GL_TEXTURE_SWIZZLE_A:
3552 if (context->getClientVersion() < 3)
3553 {
3554 return gl::error(GL_INVALID_ENUM);
3555 }
3556 *params = (GLfloat)texture->getSwizzleAlpha();
3557 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003558 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003559 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003560 }
3561 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003562 }
3563 catch(std::bad_alloc&)
3564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003565 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003566 }
3567}
3568
3569void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3570{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003571 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 +00003572
3573 try
3574 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003575 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003576
3577 if (context)
3578 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003579 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003580
Jamie Madillfb8a8302013-07-03 14:24:12 -04003581 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003584 }
3585
3586 switch (pname)
3587 {
3588 case GL_TEXTURE_MAG_FILTER:
3589 *params = texture->getMagFilter();
3590 break;
3591 case GL_TEXTURE_MIN_FILTER:
3592 *params = texture->getMinFilter();
3593 break;
3594 case GL_TEXTURE_WRAP_S:
3595 *params = texture->getWrapS();
3596 break;
3597 case GL_TEXTURE_WRAP_T:
3598 *params = texture->getWrapT();
3599 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003600 case GL_TEXTURE_WRAP_R:
3601 if (context->getClientVersion() < 3)
3602 {
3603 return gl::error(GL_INVALID_ENUM);
3604 }
3605 *params = texture->getWrapR();
3606 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003607 case GL_TEXTURE_IMMUTABLE_FORMAT:
3608 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003609 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3610 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003611 case GL_TEXTURE_IMMUTABLE_LEVELS:
3612 if (context->getClientVersion() < 3)
3613 {
3614 return gl::error(GL_INVALID_ENUM);
3615 }
Jamie Madill51a94372013-10-24 17:49:43 -04003616 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003617 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003618 case GL_TEXTURE_USAGE_ANGLE:
3619 *params = texture->getUsage();
3620 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003621 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3622 if (!context->supportsTextureFilterAnisotropy())
3623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003624 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003625 }
3626 *params = (GLint)texture->getMaxAnisotropy();
3627 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003628 case GL_TEXTURE_SWIZZLE_R:
3629 if (context->getClientVersion() < 3)
3630 {
3631 return gl::error(GL_INVALID_ENUM);
3632 }
3633 *params = texture->getSwizzleRed();
3634 break;
3635 case GL_TEXTURE_SWIZZLE_G:
3636 if (context->getClientVersion() < 3)
3637 {
3638 return gl::error(GL_INVALID_ENUM);
3639 }
3640 *params = texture->getSwizzleGreen();
3641 break;
3642 case GL_TEXTURE_SWIZZLE_B:
3643 if (context->getClientVersion() < 3)
3644 {
3645 return gl::error(GL_INVALID_ENUM);
3646 }
3647 *params = texture->getSwizzleBlue();
3648 break;
3649 case GL_TEXTURE_SWIZZLE_A:
3650 if (context->getClientVersion() < 3)
3651 {
3652 return gl::error(GL_INVALID_ENUM);
3653 }
3654 *params = texture->getSwizzleAlpha();
3655 break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00003656
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003657 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003658 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003659 }
3660 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003661 }
3662 catch(std::bad_alloc&)
3663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003664 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665 }
3666}
3667
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003668void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3669{
3670 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3671 program, location, bufSize, params);
3672
3673 try
3674 {
3675 if (bufSize < 0)
3676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003678 }
3679
3680 gl::Context *context = gl::getNonLostContext();
3681
3682 if (context)
3683 {
3684 if (program == 0)
3685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003687 }
3688
3689 gl::Program *programObject = context->getProgram(program);
3690
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003691 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003693 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003694 }
3695
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003696 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3697 if (!programBinary)
3698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003699 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003700 }
3701
3702 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003704 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003705 }
3706 }
3707 }
3708 catch(std::bad_alloc&)
3709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003711 }
3712}
3713
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003714void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003716 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003717
3718 try
3719 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003720 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003721
3722 if (context)
3723 {
3724 if (program == 0)
3725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003726 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003727 }
3728
3729 gl::Program *programObject = context->getProgram(program);
3730
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003731 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003734 }
3735
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003736 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3737 if (!programBinary)
3738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003739 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003740 }
3741
3742 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003744 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003745 }
3746 }
3747 }
3748 catch(std::bad_alloc&)
3749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003751 }
3752}
3753
3754void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3755{
3756 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3757 program, location, bufSize, params);
3758
3759 try
3760 {
3761 if (bufSize < 0)
3762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003764 }
3765
3766 gl::Context *context = gl::getNonLostContext();
3767
3768 if (context)
3769 {
3770 if (program == 0)
3771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003773 }
3774
3775 gl::Program *programObject = context->getProgram(program);
3776
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003777 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003780 }
3781
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003782 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3783 if (!programBinary)
3784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003785 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003786 }
3787
3788 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003790 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003791 }
3792 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 }
3794 catch(std::bad_alloc&)
3795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
3798}
3799
3800void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003802 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803
3804 try
3805 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003806 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003807
3808 if (context)
3809 {
3810 if (program == 0)
3811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003813 }
3814
3815 gl::Program *programObject = context->getProgram(program);
3816
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003817 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003819 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003820 }
3821
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003822 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3823 if (!programBinary)
3824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003826 }
3827
3828 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003830 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003831 }
3832 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003833 }
3834 catch(std::bad_alloc&)
3835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003837 }
3838}
3839
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003840int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003842 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003843
3844 try
3845 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003846 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003847
3848 if (strstr(name, "gl_") == name)
3849 {
3850 return -1;
3851 }
3852
3853 if (context)
3854 {
3855 gl::Program *programObject = context->getProgram(program);
3856
3857 if (!programObject)
3858 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003859 if (context->getShader(program))
3860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003862 }
3863 else
3864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003865 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003866 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 }
3868
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003869 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003870 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873 }
3874
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003875 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876 }
3877 }
3878 catch(std::bad_alloc&)
3879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003880 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 }
3882
3883 return -1;
3884}
3885
3886void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3887{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003888 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889
3890 try
3891 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003892 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893
daniel@transgaming.come0078962010-04-15 20:45:08 +00003894 if (context)
3895 {
3896 if (index >= gl::MAX_VERTEX_ATTRIBS)
3897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003898 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003899 }
3900
daniel@transgaming.com83921382011-01-08 05:46:00 +00003901 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003902
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003903 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003904 {
Jamie Madillaff71502013-07-02 11:57:05 -04003905 return;
3906 }
3907
3908 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3909 {
3910 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3911 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003912 {
Jamie Madillaff71502013-07-02 11:57:05 -04003913 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003914 }
Jamie Madillaff71502013-07-02 11:57:05 -04003915 }
3916 else
3917 {
3918 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003919 }
3920 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921 }
3922 catch(std::bad_alloc&)
3923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003924 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003925 }
3926}
3927
3928void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003930 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931
3932 try
3933 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003935
daniel@transgaming.come0078962010-04-15 20:45:08 +00003936 if (context)
3937 {
3938 if (index >= gl::MAX_VERTEX_ATTRIBS)
3939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003941 }
3942
daniel@transgaming.com83921382011-01-08 05:46:00 +00003943 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003944
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003945 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003946 {
Jamie Madillaff71502013-07-02 11:57:05 -04003947 return;
3948 }
3949
3950 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3951 {
3952 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3953 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003954 {
Jamie Madillaff71502013-07-02 11:57:05 -04003955 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003956 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003957 }
Jamie Madillaff71502013-07-02 11:57:05 -04003958 }
3959 else
3960 {
3961 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003962 }
3963 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003964 }
3965 catch(std::bad_alloc&)
3966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003967 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003968 }
3969}
3970
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003971void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003972{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003973 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003974
3975 try
3976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978
daniel@transgaming.come0078962010-04-15 20:45:08 +00003979 if (context)
3980 {
3981 if (index >= gl::MAX_VERTEX_ATTRIBS)
3982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003983 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003984 }
3985
3986 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003988 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003989 }
3990
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003991 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003992 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003993 }
3994 catch(std::bad_alloc&)
3995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003996 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997 }
3998}
3999
4000void __stdcall glHint(GLenum target, GLenum mode)
4001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004002 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003
4004 try
4005 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004006 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004007 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004008 case GL_FASTEST:
4009 case GL_NICEST:
4010 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004011 break;
4012 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004014 }
4015
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004016 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004017 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004018 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004019 case GL_GENERATE_MIPMAP_HINT:
4020 if (context) context->setGenerateMipmapHint(mode);
4021 break;
4022 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4023 if (context) context->setFragmentShaderDerivativeHint(mode);
4024 break;
4025 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004027 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004028 }
4029 catch(std::bad_alloc&)
4030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004031 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032 }
4033}
4034
4035GLboolean __stdcall glIsBuffer(GLuint buffer)
4036{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004037 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004038
4039 try
4040 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004041 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042
4043 if (context && buffer)
4044 {
4045 gl::Buffer *bufferObject = context->getBuffer(buffer);
4046
4047 if (bufferObject)
4048 {
4049 return GL_TRUE;
4050 }
4051 }
4052 }
4053 catch(std::bad_alloc&)
4054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004056 }
4057
4058 return GL_FALSE;
4059}
4060
4061GLboolean __stdcall glIsEnabled(GLenum cap)
4062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004063 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004064
4065 try
4066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068
4069 if (context)
4070 {
Geoff Lang0550d032014-01-30 11:29:07 -05004071 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074 }
Geoff Lang0550d032014-01-30 11:29:07 -05004075
4076 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077 }
4078 }
4079 catch(std::bad_alloc&)
4080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004081 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004082 }
4083
4084 return false;
4085}
4086
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004087GLboolean __stdcall glIsFenceNV(GLuint fence)
4088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004089 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004090
4091 try
4092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004093 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004094
4095 if (context)
4096 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004097 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004098
4099 if (fenceObject == NULL)
4100 {
4101 return GL_FALSE;
4102 }
4103
4104 return fenceObject->isFence();
4105 }
4106 }
4107 catch(std::bad_alloc&)
4108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004109 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004110 }
4111
4112 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004113}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004114
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004117 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004118
4119 try
4120 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004121 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004122
4123 if (context && framebuffer)
4124 {
4125 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4126
4127 if (framebufferObject)
4128 {
4129 return GL_TRUE;
4130 }
4131 }
4132 }
4133 catch(std::bad_alloc&)
4134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004135 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136 }
4137
4138 return GL_FALSE;
4139}
4140
4141GLboolean __stdcall glIsProgram(GLuint program)
4142{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004143 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144
4145 try
4146 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148
4149 if (context && program)
4150 {
4151 gl::Program *programObject = context->getProgram(program);
4152
4153 if (programObject)
4154 {
4155 return GL_TRUE;
4156 }
4157 }
4158 }
4159 catch(std::bad_alloc&)
4160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004161 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004162 }
4163
4164 return GL_FALSE;
4165}
4166
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004167GLboolean __stdcall glIsQueryEXT(GLuint id)
4168{
4169 EVENT("(GLuint id = %d)", id);
4170
4171 try
4172 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004173 gl::Context *context = gl::getNonLostContext();
4174
4175 if (context)
4176 {
Geoff Lang37dde692014-01-31 16:34:54 -05004177 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004178 }
4179 }
4180 catch(std::bad_alloc&)
4181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004182 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004183 }
4184
4185 return GL_FALSE;
4186}
4187
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004190 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004191
4192 try
4193 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004194 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004195
4196 if (context && renderbuffer)
4197 {
4198 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4199
4200 if (renderbufferObject)
4201 {
4202 return GL_TRUE;
4203 }
4204 }
4205 }
4206 catch(std::bad_alloc&)
4207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004208 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209 }
4210
4211 return GL_FALSE;
4212}
4213
4214GLboolean __stdcall glIsShader(GLuint shader)
4215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004216 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004217
4218 try
4219 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004221
4222 if (context && shader)
4223 {
4224 gl::Shader *shaderObject = context->getShader(shader);
4225
4226 if (shaderObject)
4227 {
4228 return GL_TRUE;
4229 }
4230 }
4231 }
4232 catch(std::bad_alloc&)
4233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004234 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235 }
4236
4237 return GL_FALSE;
4238}
4239
4240GLboolean __stdcall glIsTexture(GLuint texture)
4241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004242 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243
4244 try
4245 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004246 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247
4248 if (context && texture)
4249 {
4250 gl::Texture *textureObject = context->getTexture(texture);
4251
4252 if (textureObject)
4253 {
4254 return GL_TRUE;
4255 }
4256 }
4257 }
4258 catch(std::bad_alloc&)
4259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 }
4262
4263 return GL_FALSE;
4264}
4265
4266void __stdcall glLineWidth(GLfloat width)
4267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004268 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269
4270 try
4271 {
4272 if (width <= 0.0f)
4273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004274 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275 }
4276
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004278
4279 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004281 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 }
4283 }
4284 catch(std::bad_alloc&)
4285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004286 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004287 }
4288}
4289
4290void __stdcall glLinkProgram(GLuint program)
4291{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004292 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004293
4294 try
4295 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297
4298 if (context)
4299 {
4300 gl::Program *programObject = context->getProgram(program);
4301
4302 if (!programObject)
4303 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004304 if (context->getShader(program))
4305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004306 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004307 }
4308 else
4309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004310 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004311 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004312 }
4313
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004314 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004315 }
4316 }
4317 catch(std::bad_alloc&)
4318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004319 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320 }
4321}
4322
4323void __stdcall glPixelStorei(GLenum pname, GLint param)
4324{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004325 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326
4327 try
4328 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004330
4331 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004333 switch (pname)
4334 {
4335 case GL_UNPACK_ALIGNMENT:
4336 if (param != 1 && param != 2 && param != 4 && param != 8)
4337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004338 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004339 }
4340
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004341 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004342 break;
4343
4344 case GL_PACK_ALIGNMENT:
4345 if (param != 1 && param != 2 && param != 4 && param != 8)
4346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004348 }
4349
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004350 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004351 break;
4352
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004353 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4354 context->setPackReverseRowOrder(param != 0);
4355 break;
4356
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004357 case GL_UNPACK_IMAGE_HEIGHT:
4358 case GL_UNPACK_SKIP_IMAGES:
4359 case GL_UNPACK_ROW_LENGTH:
4360 case GL_UNPACK_SKIP_ROWS:
4361 case GL_UNPACK_SKIP_PIXELS:
4362 case GL_PACK_ROW_LENGTH:
4363 case GL_PACK_SKIP_ROWS:
4364 case GL_PACK_SKIP_PIXELS:
4365 if (context->getClientVersion() < 3)
4366 {
4367 return gl::error(GL_INVALID_ENUM);
4368 }
4369 UNIMPLEMENTED();
4370 break;
4371
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004372 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004373 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004374 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004375 }
4376 }
4377 catch(std::bad_alloc&)
4378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004379 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004380 }
4381}
4382
4383void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4384{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004385 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004386
4387 try
4388 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004389 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004390
4391 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004392 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004393 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395 }
4396 catch(std::bad_alloc&)
4397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004398 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004399 }
4400}
4401
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004402void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4403 GLenum format, GLenum type, GLsizei bufSize,
4404 GLvoid *data)
4405{
4406 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4407 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4408 x, y, width, height, format, type, bufSize, data);
4409
4410 try
4411 {
4412 if (width < 0 || height < 0 || bufSize < 0)
4413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004414 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004415 }
4416
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004417 gl::Context *context = gl::getNonLostContext();
4418
4419 if (context)
4420 {
Geoff Lang005df412013-10-16 14:12:50 -04004421 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004422
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004423 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4424 // and attempting to read back if that's the case is an error. The error will be registered
4425 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004426 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004427 return;
4428
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004429 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4430 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004431
4432 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004434 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004435 }
4436
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004437 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4438 }
4439 }
4440 catch(std::bad_alloc&)
4441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004442 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004443 }
4444}
4445
4446void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4447 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004449 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004450 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004451 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452
4453 try
4454 {
4455 if (width < 0 || height < 0)
4456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004457 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004458 }
4459
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004461
4462 if (context)
4463 {
Geoff Lang005df412013-10-16 14:12:50 -04004464 GLenum currentInternalFormat, currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004465
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004466 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4467 // and attempting to read back if that's the case is an error. The error will be registered
4468 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004469 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004470 return;
4471
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004472 bool validReadFormat = (context->getClientVersion() < 3) ? gl::ValidES2ReadFormatType(format, type) :
4473 gl::ValidES3ReadFormatType(currentInternalFormat, format, type);
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00004474
4475 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004478 }
4479
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004480 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004481 }
4482 }
4483 catch(std::bad_alloc&)
4484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004485 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 }
4487}
4488
4489void __stdcall glReleaseShaderCompiler(void)
4490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004491 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004492
4493 try
4494 {
4495 gl::Shader::releaseCompiler();
4496 }
4497 catch(std::bad_alloc&)
4498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004499 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500 }
4501}
4502
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004503void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004505 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 +00004506 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507
4508 try
4509 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511
4512 if (context)
4513 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004514 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004515 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004516 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004517 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004519
4520 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521 }
4522 }
4523 catch(std::bad_alloc&)
4524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 }
4527}
4528
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004529void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4530{
4531 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4532}
4533
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4535{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004536 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537
4538 try
4539 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004540 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004541
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542 if (context)
4543 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004544 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546 }
4547 catch(std::bad_alloc&)
4548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004549 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550 }
4551}
4552
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004553void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004555 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004556
4557 try
4558 {
4559 if (condition != GL_ALL_COMPLETED_NV)
4560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004561 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004562 }
4563
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004564 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004565
4566 if (context)
4567 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004568 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004569
4570 if (fenceObject == NULL)
4571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004572 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004573 }
4574
4575 fenceObject->setFence(condition);
4576 }
4577 }
4578 catch(std::bad_alloc&)
4579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004580 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004581 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004582}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004583
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004586 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 +00004587
4588 try
4589 {
4590 if (width < 0 || height < 0)
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004595 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004596
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 if (context)
4598 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004599 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600 }
4601 }
4602 catch(std::bad_alloc&)
4603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004605 }
4606}
4607
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004608void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004610 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004611 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004612 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004613
4614 try
4615 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004616 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004618 }
4619 catch(std::bad_alloc&)
4620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623}
4624
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004625void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004627 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 +00004628 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629
4630 try
4631 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004632 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004634 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635 }
4636
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004637 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638
4639 if (context)
4640 {
4641 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004642
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 if (!shaderObject)
4644 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004645 if (context->getProgram(shader))
4646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004647 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004648 }
4649 else
4650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004652 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004653 }
4654
4655 shaderObject->setSource(count, string, length);
4656 }
4657 }
4658 catch(std::bad_alloc&)
4659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661 }
4662}
4663
4664void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4665{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004666 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004667}
4668
4669void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004671 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 +00004672
4673 try
4674 {
4675 switch (face)
4676 {
4677 case GL_FRONT:
4678 case GL_BACK:
4679 case GL_FRONT_AND_BACK:
4680 break;
4681 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004682 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683 }
4684
4685 switch (func)
4686 {
4687 case GL_NEVER:
4688 case GL_ALWAYS:
4689 case GL_LESS:
4690 case GL_LEQUAL:
4691 case GL_EQUAL:
4692 case GL_GEQUAL:
4693 case GL_GREATER:
4694 case GL_NOTEQUAL:
4695 break;
4696 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004697 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698 }
4699
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004700 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004701
4702 if (context)
4703 {
4704 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4705 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004706 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004707 }
4708
4709 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4710 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004711 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004712 }
4713 }
4714 }
4715 catch(std::bad_alloc&)
4716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004718 }
4719}
4720
4721void __stdcall glStencilMask(GLuint mask)
4722{
4723 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4724}
4725
4726void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4727{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004728 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729
4730 try
4731 {
4732 switch (face)
4733 {
4734 case GL_FRONT:
4735 case GL_BACK:
4736 case GL_FRONT_AND_BACK:
4737 break;
4738 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004739 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004740 }
4741
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004742 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743
4744 if (context)
4745 {
4746 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4747 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004748 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004749 }
4750
4751 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4752 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004753 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 }
4755 }
4756 }
4757 catch(std::bad_alloc&)
4758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004759 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760 }
4761}
4762
4763void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4764{
4765 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4766}
4767
4768void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004770 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 +00004771 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772
4773 try
4774 {
4775 switch (face)
4776 {
4777 case GL_FRONT:
4778 case GL_BACK:
4779 case GL_FRONT_AND_BACK:
4780 break;
4781 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004782 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004783 }
4784
4785 switch (fail)
4786 {
4787 case GL_ZERO:
4788 case GL_KEEP:
4789 case GL_REPLACE:
4790 case GL_INCR:
4791 case GL_DECR:
4792 case GL_INVERT:
4793 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004794 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004795 break;
4796 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798 }
4799
4800 switch (zfail)
4801 {
4802 case GL_ZERO:
4803 case GL_KEEP:
4804 case GL_REPLACE:
4805 case GL_INCR:
4806 case GL_DECR:
4807 case GL_INVERT:
4808 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004809 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810 break;
4811 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004812 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814
4815 switch (zpass)
4816 {
4817 case GL_ZERO:
4818 case GL_KEEP:
4819 case GL_REPLACE:
4820 case GL_INCR:
4821 case GL_DECR:
4822 case GL_INVERT:
4823 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004824 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825 break;
4826 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004827 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004828 }
4829
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004830 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831
4832 if (context)
4833 {
4834 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4835 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004836 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004837 }
4838
4839 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4840 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004841 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843 }
4844 }
4845 catch(std::bad_alloc&)
4846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004847 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 }
4849}
4850
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004851GLboolean __stdcall glTestFenceNV(GLuint fence)
4852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004853 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004854
4855 try
4856 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004857 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004858
4859 if (context)
4860 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004861 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004862
4863 if (fenceObject == NULL)
4864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004865 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004866 }
4867
Jamie Madillfb9a7402013-07-26 11:55:01 -04004868 if (fenceObject->isFence() != GL_TRUE)
4869 {
4870 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4871 }
4872
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004873 return fenceObject->testFence();
4874 }
4875 }
4876 catch(std::bad_alloc&)
4877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004878 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004879 }
4880
4881 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004882}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004883
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004884void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4885 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004887 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004888 "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 +00004889 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004890
4891 try
4892 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004893 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894
4895 if (context)
4896 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004897 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004898 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004899 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004900 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004901 return;
4902 }
4903
4904 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004905 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004906 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004907 {
4908 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004909 }
4910
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004911 switch (target)
4912 {
4913 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004914 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004915 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004916 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004917 }
4918 break;
4919 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004920 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004921 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004922 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004923 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004924 break;
4925 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4926 {
4927 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004928 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004929 }
4930 break;
4931 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4932 {
4933 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004934 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004935 }
4936 break;
4937 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4938 {
4939 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004940 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004941 }
4942 break;
4943 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4944 {
4945 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004946 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004947 }
4948 break;
4949 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4950 {
4951 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004952 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004953 }
4954 break;
4955 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004956 }
4957 }
4958 }
4959 catch(std::bad_alloc&)
4960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 }
4963}
4964
4965void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4966{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004967 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4968
4969 try
4970 {
4971 gl::Context *context = gl::getNonLostContext();
4972
4973 if (context)
4974 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004975 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004976 {
4977 return;
4978 }
4979
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004980 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004981
Jamie Madillfb8a8302013-07-03 14:24:12 -04004982 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004984 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004985 }
4986
4987 switch (pname)
4988 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004989 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4990 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4991 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4992 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4993 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4994 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
4995 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(static_cast<GLfloat>(param), context->getTextureMaxAnisotropy()); break;
4996 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4997 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004998 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4999 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5000 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5001 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005002
Jamie Madill478fdb22013-07-19 16:36:59 -04005003 case GL_TEXTURE_BASE_LEVEL:
5004 case GL_TEXTURE_MAX_LEVEL:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005005 case GL_TEXTURE_MIN_LOD:
5006 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005007 UNIMPLEMENTED();
5008 break;
5009
Jamie Madill478fdb22013-07-19 16:36:59 -04005010 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005011 }
5012 }
5013 }
5014 catch(std::bad_alloc&)
5015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005017 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005018}
5019
5020void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5021{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005022 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005023}
5024
5025void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5026{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005027 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005028
5029 try
5030 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032
5033 if (context)
5034 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005035 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005036 {
5037 return;
5038 }
5039
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005040 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041
Jamie Madillfb8a8302013-07-03 14:24:12 -04005042 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005044 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045 }
5046
5047 switch (pname)
5048 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005049 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5050 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5051 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5052 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5053 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5054 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5055 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5056 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5057 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005058 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5059 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5060 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5061 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005062
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005063 case GL_TEXTURE_BASE_LEVEL:
5064 case GL_TEXTURE_MAX_LEVEL:
Jamie Madill478fdb22013-07-19 16:36:59 -04005065 case GL_TEXTURE_MIN_LOD:
5066 case GL_TEXTURE_MAX_LOD:
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00005067 UNIMPLEMENTED();
5068 break;
5069
Jamie Madill478fdb22013-07-19 16:36:59 -04005070 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071 }
5072 }
5073 }
5074 catch(std::bad_alloc&)
5075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005076 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005077 }
5078}
5079
5080void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5081{
5082 glTexParameteri(target, pname, *params);
5083}
5084
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005085void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5086{
5087 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5088 target, levels, internalformat, width, height);
5089
5090 try
5091 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005092 gl::Context *context = gl::getNonLostContext();
5093
5094 if (context)
5095 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005096 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005097 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005098 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005099 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005100 }
5101
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005102 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005103 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005104 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005105 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005106 }
5107
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005108 switch (target)
5109 {
5110 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005111 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005112 gl::Texture2D *texture2d = context->getTexture2D();
5113 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005114 }
5115 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005116
Geoff Lang01c21d22013-09-24 11:52:16 -04005117 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005118 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005119 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5120 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005121 }
5122 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005123
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005124 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005125 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005126 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005127 }
5128 }
5129 catch(std::bad_alloc&)
5130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005132 }
5133}
5134
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005135void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5136 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005138 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005139 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005140 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005141 target, level, xoffset, yoffset, width, height, format, type, pixels);
5142
5143 try
5144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005146
5147 if (context)
5148 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005149 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005150 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005151 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005152 {
5153 return;
5154 }
5155
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005156 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005157 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005158 0, 0, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005159 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005160 return;
5161 }
5162
5163 switch (target)
5164 {
5165 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005166 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005167 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005168 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005169 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005170 break;
5171
5172 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5173 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5174 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5175 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5176 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5177 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005178 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005179 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005180 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005181 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005182 break;
5183
5184 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005185 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005186 }
5187 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188 }
5189 catch(std::bad_alloc&)
5190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192 }
5193}
5194
5195void __stdcall glUniform1f(GLint location, GLfloat x)
5196{
5197 glUniform1fv(location, 1, &x);
5198}
5199
5200void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5201{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005202 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203
5204 try
5205 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206 if (count < 0)
5207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005208 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005209 }
5210
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005211 if (location == -1)
5212 {
5213 return;
5214 }
5215
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005216 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217
5218 if (context)
5219 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005220 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005221 if (!programBinary)
5222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005223 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005224 }
5225
5226 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005228 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229 }
5230 }
5231 }
5232 catch(std::bad_alloc&)
5233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235 }
5236}
5237
5238void __stdcall glUniform1i(GLint location, GLint x)
5239{
5240 glUniform1iv(location, 1, &x);
5241}
5242
5243void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005245 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005246
5247 try
5248 {
5249 if (count < 0)
5250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005251 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005252 }
5253
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005254 if (location == -1)
5255 {
5256 return;
5257 }
5258
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260
5261 if (context)
5262 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005263 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005264 if (!programBinary)
5265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005266 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005267 }
5268
5269 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005271 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273 }
5274 }
5275 catch(std::bad_alloc&)
5276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005278 }
5279}
5280
5281void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5282{
5283 GLfloat xy[2] = {x, y};
5284
5285 glUniform2fv(location, 1, (GLfloat*)&xy);
5286}
5287
5288void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5289{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005290 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291
5292 try
5293 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005294 if (count < 0)
5295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005297 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005298
5299 if (location == -1)
5300 {
5301 return;
5302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005304 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005305
5306 if (context)
5307 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005308 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005309 if (!programBinary)
5310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005311 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005312 }
5313
5314 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005316 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005317 }
5318 }
5319 }
5320 catch(std::bad_alloc&)
5321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005322 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323 }
5324}
5325
5326void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5327{
5328 GLint xy[4] = {x, y};
5329
5330 glUniform2iv(location, 1, (GLint*)&xy);
5331}
5332
5333void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005335 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336
5337 try
5338 {
5339 if (count < 0)
5340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342 }
5343
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005344 if (location == -1)
5345 {
5346 return;
5347 }
5348
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005350
5351 if (context)
5352 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005353 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005354 if (!programBinary)
5355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005356 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005357 }
5358
5359 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005362 }
5363 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005364 }
5365 catch(std::bad_alloc&)
5366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 }
5369}
5370
5371void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5372{
5373 GLfloat xyz[3] = {x, y, z};
5374
5375 glUniform3fv(location, 1, (GLfloat*)&xyz);
5376}
5377
5378void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005380 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005381
5382 try
5383 {
5384 if (count < 0)
5385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005387 }
5388
5389 if (location == -1)
5390 {
5391 return;
5392 }
5393
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005394 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005395
5396 if (context)
5397 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005398 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005399 if (!programBinary)
5400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005401 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005402 }
5403
5404 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005406 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005407 }
5408 }
5409 }
5410 catch(std::bad_alloc&)
5411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005412 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413 }
5414}
5415
5416void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5417{
5418 GLint xyz[3] = {x, y, z};
5419
5420 glUniform3iv(location, 1, (GLint*)&xyz);
5421}
5422
5423void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5424{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005425 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005426
5427 try
5428 {
5429 if (count < 0)
5430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 }
5433
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005434 if (location == -1)
5435 {
5436 return;
5437 }
5438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005440
5441 if (context)
5442 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005443 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005444 if (!programBinary)
5445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005447 }
5448
5449 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005451 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005452 }
5453 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454 }
5455 catch(std::bad_alloc&)
5456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005457 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458 }
5459}
5460
5461void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5462{
5463 GLfloat xyzw[4] = {x, y, z, w};
5464
5465 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5466}
5467
5468void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005470 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005471
5472 try
5473 {
5474 if (count < 0)
5475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005477 }
5478
5479 if (location == -1)
5480 {
5481 return;
5482 }
5483
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005484 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005485
5486 if (context)
5487 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005488 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005489 if (!programBinary)
5490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005491 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005492 }
5493
5494 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005496 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005497 }
5498 }
5499 }
5500 catch(std::bad_alloc&)
5501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005502 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503 }
5504}
5505
5506void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5507{
5508 GLint xyzw[4] = {x, y, z, w};
5509
5510 glUniform4iv(location, 1, (GLint*)&xyzw);
5511}
5512
5513void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5514{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005515 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516
5517 try
5518 {
5519 if (count < 0)
5520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522 }
5523
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005524 if (location == -1)
5525 {
5526 return;
5527 }
5528
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005529 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005530
5531 if (context)
5532 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005533 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005534 if (!programBinary)
5535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005536 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005537 }
5538
5539 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005541 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005542 }
5543 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 }
5545 catch(std::bad_alloc&)
5546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005548 }
5549}
5550
5551void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5552{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005553 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005554 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555
5556 try
5557 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005558 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561 }
5562
5563 if (location == -1)
5564 {
5565 return;
5566 }
5567
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005568 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569
5570 if (context)
5571 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005572 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5573 {
5574 return gl::error(GL_INVALID_VALUE);
5575 }
5576
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005577 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005578 if (!programBinary)
5579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005580 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005581 }
5582
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005583 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005585 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586 }
5587 }
5588 }
5589 catch(std::bad_alloc&)
5590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592 }
5593}
5594
5595void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5596{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005597 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005598 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599
5600 try
5601 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005602 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005605 }
5606
5607 if (location == -1)
5608 {
5609 return;
5610 }
5611
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613
5614 if (context)
5615 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005616 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5617 {
5618 return gl::error(GL_INVALID_VALUE);
5619 }
5620
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005621 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005622 if (!programBinary)
5623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005624 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005625 }
5626
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005627 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005629 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005630 }
5631 }
5632 }
5633 catch(std::bad_alloc&)
5634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 }
5637}
5638
5639void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5640{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005641 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005642 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643
5644 try
5645 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005646 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
5650
5651 if (location == -1)
5652 {
5653 return;
5654 }
5655
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657
5658 if (context)
5659 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005660 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5661 {
5662 return gl::error(GL_INVALID_VALUE);
5663 }
5664
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005665 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005666 if (!programBinary)
5667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005668 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005669 }
5670
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005671 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005673 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
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 glUseProgram(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.com4f39fd92010-03-08 20:26:45 +00005690
5691 if (context)
5692 {
5693 gl::Program *programObject = context->getProgram(program);
5694
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005695 if (!programObject && program != 0)
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.comc8478202010-04-13 19:53:35 +00005700 }
5701 else
5702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005703 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005704 }
5705 }
5706
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005707 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005709 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005710 }
5711
5712 context->useProgram(program);
5713 }
5714 }
5715 catch(std::bad_alloc&)
5716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719}
5720
5721void __stdcall glValidateProgram(GLuint program)
5722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005723 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005724
5725 try
5726 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005728
5729 if (context)
5730 {
5731 gl::Program *programObject = context->getProgram(program);
5732
5733 if (!programObject)
5734 {
5735 if (context->getShader(program))
5736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005737 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005738 }
5739 else
5740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005741 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005742 }
5743 }
5744
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005745 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005746 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748 catch(std::bad_alloc&)
5749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005750 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005751 }
5752}
5753
5754void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5755{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005756 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005757
5758 try
5759 {
5760 if (index >= gl::MAX_VERTEX_ATTRIBS)
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005763 }
5764
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005765 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005766
5767 if (context)
5768 {
5769 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005770 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005771 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773 catch(std::bad_alloc&)
5774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005776 }
5777}
5778
5779void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005781 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005782
5783 try
5784 {
5785 if (index >= gl::MAX_VERTEX_ATTRIBS)
5786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005788 }
5789
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005791
5792 if (context)
5793 {
5794 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005795 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005796 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798 catch(std::bad_alloc&)
5799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802}
5803
5804void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005806 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005807
5808 try
5809 {
5810 if (index >= gl::MAX_VERTEX_ATTRIBS)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 }
5814
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005815 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005816
5817 if (context)
5818 {
5819 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005820 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005821 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823 catch(std::bad_alloc&)
5824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005825 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005826 }
5827}
5828
5829void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005831 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005832
5833 try
5834 {
5835 if (index >= gl::MAX_VERTEX_ATTRIBS)
5836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838 }
5839
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005841
5842 if (context)
5843 {
5844 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005845 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005846 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
5848 catch(std::bad_alloc&)
5849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005850 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 }
5852}
5853
5854void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5855{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005856 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 +00005857
5858 try
5859 {
5860 if (index >= gl::MAX_VERTEX_ATTRIBS)
5861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005862 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005863 }
5864
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005866
5867 if (context)
5868 {
5869 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005870 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005871 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
5873 catch(std::bad_alloc&)
5874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005875 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005876 }
5877}
5878
5879void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005881 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005882
5883 try
5884 {
5885 if (index >= gl::MAX_VERTEX_ATTRIBS)
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005888 }
5889
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005891
5892 if (context)
5893 {
5894 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005895 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005896 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
5898 catch(std::bad_alloc&)
5899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005901 }
5902}
5903
5904void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005906 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 +00005907
5908 try
5909 {
5910 if (index >= gl::MAX_VERTEX_ATTRIBS)
5911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005912 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005913 }
5914
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005915 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005916
5917 if (context)
5918 {
5919 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005920 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005921 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
5923 catch(std::bad_alloc&)
5924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005925 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005926 }
5927}
5928
5929void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5930{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005931 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932
5933 try
5934 {
5935 if (index >= gl::MAX_VERTEX_ATTRIBS)
5936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005937 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938 }
5939
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005940 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005941
5942 if (context)
5943 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005944 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005945 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005946 }
5947 catch(std::bad_alloc&)
5948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005949 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 }
5951}
5952
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005953void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5954{
5955 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5956
5957 try
5958 {
5959 if (index >= gl::MAX_VERTEX_ATTRIBS)
5960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005961 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005962 }
5963
5964 gl::Context *context = gl::getNonLostContext();
5965
5966 if (context)
5967 {
5968 context->setVertexAttribDivisor(index, divisor);
5969 }
5970 }
5971 catch(std::bad_alloc&)
5972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005974 }
5975}
5976
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005977void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005979 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005980 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005981 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005982
5983 try
5984 {
5985 if (index >= gl::MAX_VERTEX_ATTRIBS)
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
5990 if (size < 1 || size > 4)
5991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005993 }
5994
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005995 gl::Context *context = gl::getNonLostContext();
5996
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 switch (type)
5998 {
5999 case GL_BYTE:
6000 case GL_UNSIGNED_BYTE:
6001 case GL_SHORT:
6002 case GL_UNSIGNED_SHORT:
6003 case GL_FIXED:
6004 case GL_FLOAT:
6005 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006006 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006007 case GL_INT:
6008 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006009 case GL_INT_2_10_10_10_REV:
6010 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006011 if (context && context->getClientVersion() < 3)
6012 {
6013 return gl::error(GL_INVALID_ENUM);
6014 }
6015 else
6016 {
6017 break;
6018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006020 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006021 }
6022
6023 if (stride < 0)
6024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026 }
6027
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006028 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6029 {
6030 return gl::error(GL_INVALID_OPERATION);
6031 }
6032
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033 if (context)
6034 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006035 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6036 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6037 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6038 // and the pointer argument is not NULL.
6039 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6040 {
6041 return gl::error(GL_INVALID_OPERATION);
6042 }
6043
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006044 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6045 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046 }
6047 }
6048 catch(std::bad_alloc&)
6049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 }
6052}
6053
6054void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006056 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 +00006057
6058 try
6059 {
6060 if (width < 0 || height < 0)
6061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006062 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006063 }
6064
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006066
6067 if (context)
6068 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006069 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070 }
6071 }
6072 catch(std::bad_alloc&)
6073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006075 }
6076}
6077
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006078// OpenGL ES 3.0 functions
6079
6080void __stdcall glReadBuffer(GLenum mode)
6081{
6082 EVENT("(GLenum mode = 0x%X)", mode);
6083
6084 try
6085 {
6086 gl::Context *context = gl::getNonLostContext();
6087
6088 if (context)
6089 {
6090 if (context->getClientVersion() < 3)
6091 {
6092 return gl::error(GL_INVALID_OPERATION);
6093 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006094
Jamie Madill54133512013-06-21 09:33:07 -04006095 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006096 UNIMPLEMENTED();
6097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006098 }
6099 catch(std::bad_alloc&)
6100 {
6101 return gl::error(GL_OUT_OF_MEMORY);
6102 }
6103}
6104
6105void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6106{
6107 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6108 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6109
6110 try
6111 {
6112 gl::Context *context = gl::getNonLostContext();
6113
6114 if (context)
6115 {
6116 if (context->getClientVersion() < 3)
6117 {
6118 return gl::error(GL_INVALID_OPERATION);
6119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006120
Jamie Madill54133512013-06-21 09:33:07 -04006121 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006122 UNIMPLEMENTED();
6123 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006124 }
6125 catch(std::bad_alloc&)
6126 {
6127 return gl::error(GL_OUT_OF_MEMORY);
6128 }
6129}
6130
6131void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6132{
6133 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6134 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6135 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6136 target, level, internalformat, width, height, depth, border, format, type, pixels);
6137
6138 try
6139 {
6140 gl::Context *context = gl::getNonLostContext();
6141
6142 if (context)
6143 {
6144 if (context->getClientVersion() < 3)
6145 {
6146 return gl::error(GL_INVALID_OPERATION);
6147 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006148
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006149 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006150 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006151 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006152 {
6153 return;
6154 }
6155
6156 switch(target)
6157 {
6158 case GL_TEXTURE_3D:
6159 {
6160 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006161 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006162 }
6163 break;
6164
6165 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006166 {
6167 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006168 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006169 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006170 break;
6171
6172 default:
6173 return gl::error(GL_INVALID_ENUM);
6174 }
6175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006176 }
6177 catch(std::bad_alloc&)
6178 {
6179 return gl::error(GL_OUT_OF_MEMORY);
6180 }
6181}
6182
6183void __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)
6184{
6185 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6186 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6187 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6188 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6189
6190 try
6191 {
6192 gl::Context *context = gl::getNonLostContext();
6193
6194 if (context)
6195 {
6196 if (context->getClientVersion() < 3)
6197 {
6198 return gl::error(GL_INVALID_OPERATION);
6199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006200
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006201 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006202 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006203 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006204 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006205 {
6206 return;
6207 }
6208
6209 switch(target)
6210 {
6211 case GL_TEXTURE_3D:
6212 {
6213 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006214 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 +00006215 }
6216 break;
6217
6218 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006219 {
6220 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006221 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 +00006222 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006223 break;
6224
6225 default:
6226 return gl::error(GL_INVALID_ENUM);
6227 }
6228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006229 }
6230 catch(std::bad_alloc&)
6231 {
6232 return gl::error(GL_OUT_OF_MEMORY);
6233 }
6234}
6235
6236void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6237{
6238 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6239 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6240 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6241
6242 try
6243 {
6244 gl::Context *context = gl::getNonLostContext();
6245
6246 if (context)
6247 {
6248 if (context->getClientVersion() < 3)
6249 {
6250 return gl::error(GL_INVALID_OPERATION);
6251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006252
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006253 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006254 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006255 {
6256 return;
6257 }
6258
6259 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6260 gl::Texture *texture = NULL;
6261 switch (target)
6262 {
6263 case GL_TEXTURE_3D:
6264 texture = context->getTexture3D();
6265 break;
6266
6267 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006268 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006269 break;
6270
6271 default:
6272 return gl::error(GL_INVALID_ENUM);
6273 }
6274
6275 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006277 }
6278 catch(std::bad_alloc&)
6279 {
6280 return gl::error(GL_OUT_OF_MEMORY);
6281 }
6282}
6283
6284void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6285{
Geoff Langeef52cc2013-10-16 15:07:39 -04006286 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 +00006287 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6288 "const GLvoid* data = 0x%0.8p)",
6289 target, level, internalformat, width, height, depth, border, imageSize, data);
6290
6291 try
6292 {
6293 gl::Context *context = gl::getNonLostContext();
6294
6295 if (context)
6296 {
6297 if (context->getClientVersion() < 3)
6298 {
6299 return gl::error(GL_INVALID_OPERATION);
6300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006301
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006302 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 +00006303 {
6304 return gl::error(GL_INVALID_VALUE);
6305 }
6306
6307 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006308 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006309 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006310 {
6311 return;
6312 }
6313
6314 switch(target)
6315 {
6316 case GL_TEXTURE_3D:
6317 {
6318 gl::Texture3D *texture = context->getTexture3D();
6319 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6320 }
6321 break;
6322
6323 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006324 {
6325 gl::Texture2DArray *texture = context->getTexture2DArray();
6326 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6327 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006328 break;
6329
6330 default:
6331 return gl::error(GL_INVALID_ENUM);
6332 }
6333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006334 }
6335 catch(std::bad_alloc&)
6336 {
6337 return gl::error(GL_OUT_OF_MEMORY);
6338 }
6339}
6340
6341void __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)
6342{
6343 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6344 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6345 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6346 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6347
6348 try
6349 {
6350 gl::Context *context = gl::getNonLostContext();
6351
6352 if (context)
6353 {
6354 if (context->getClientVersion() < 3)
6355 {
6356 return gl::error(GL_INVALID_OPERATION);
6357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006358
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006359 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 +00006360 {
6361 return gl::error(GL_INVALID_VALUE);
6362 }
6363
6364 if (!data)
6365 {
6366 return gl::error(GL_INVALID_VALUE);
6367 }
6368
6369 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006370 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006371 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006372 {
6373 return;
6374 }
6375
6376 switch(target)
6377 {
6378 case GL_TEXTURE_3D:
6379 {
6380 gl::Texture3D *texture = context->getTexture3D();
6381 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6382 format, imageSize, data);
6383 }
6384 break;
6385
6386 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006387 {
6388 gl::Texture2DArray *texture = context->getTexture2DArray();
6389 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6390 format, imageSize, data);
6391 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006392 break;
6393
6394 default:
6395 return gl::error(GL_INVALID_ENUM);
6396 }
6397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006398 }
6399 catch(std::bad_alloc&)
6400 {
6401 return gl::error(GL_OUT_OF_MEMORY);
6402 }
6403}
6404
6405void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6406{
6407 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6408
6409 try
6410 {
6411 gl::Context *context = gl::getNonLostContext();
6412
6413 if (context)
6414 {
6415 if (context->getClientVersion() < 3)
6416 {
6417 return gl::error(GL_INVALID_OPERATION);
6418 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006419
Geoff Lang37dde692014-01-31 16:34:54 -05006420 if (n < 0)
6421 {
6422 return gl::error(GL_INVALID_VALUE);
6423 }
6424
6425 for (GLsizei i = 0; i < n; i++)
6426 {
6427 ids[i] = context->createQuery();
6428 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006430 }
6431 catch(std::bad_alloc&)
6432 {
6433 return gl::error(GL_OUT_OF_MEMORY);
6434 }
6435}
6436
6437void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6438{
6439 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6440
6441 try
6442 {
6443 gl::Context *context = gl::getNonLostContext();
6444
6445 if (context)
6446 {
6447 if (context->getClientVersion() < 3)
6448 {
6449 return gl::error(GL_INVALID_OPERATION);
6450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006451
Geoff Lang37dde692014-01-31 16:34:54 -05006452 if (n < 0)
6453 {
6454 return gl::error(GL_INVALID_VALUE);
6455 }
6456
6457 for (GLsizei i = 0; i < n; i++)
6458 {
6459 context->deleteQuery(ids[i]);
6460 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006462 }
6463 catch(std::bad_alloc&)
6464 {
6465 return gl::error(GL_OUT_OF_MEMORY);
6466 }
6467}
6468
6469GLboolean __stdcall glIsQuery(GLuint id)
6470{
6471 EVENT("(GLuint id = %u)", id);
6472
6473 try
6474 {
6475 gl::Context *context = gl::getNonLostContext();
6476
6477 if (context)
6478 {
6479 if (context->getClientVersion() < 3)
6480 {
6481 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006483
Geoff Lang37dde692014-01-31 16:34:54 -05006484 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006485 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006486 }
6487 catch(std::bad_alloc&)
6488 {
6489 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6490 }
6491
6492 return GL_FALSE;
6493}
6494
6495void __stdcall glBeginQuery(GLenum target, GLuint id)
6496{
6497 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6498
6499 try
6500 {
6501 gl::Context *context = gl::getNonLostContext();
6502
6503 if (context)
6504 {
6505 if (context->getClientVersion() < 3)
6506 {
6507 return gl::error(GL_INVALID_OPERATION);
6508 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006509
Geoff Lang37dde692014-01-31 16:34:54 -05006510 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006511 {
Geoff Lang37dde692014-01-31 16:34:54 -05006512 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006513 }
6514
6515 if (id == 0)
6516 {
6517 return gl::error(GL_INVALID_OPERATION);
6518 }
6519
Geoff Lang37dde692014-01-31 16:34:54 -05006520 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006522 }
6523 catch(std::bad_alloc&)
6524 {
6525 return gl::error(GL_OUT_OF_MEMORY);
6526 }
6527}
6528
6529void __stdcall glEndQuery(GLenum target)
6530{
6531 EVENT("(GLenum target = 0x%X)", target);
6532
6533 try
6534 {
6535 gl::Context *context = gl::getNonLostContext();
6536
6537 if (context)
6538 {
6539 if (context->getClientVersion() < 3)
6540 {
6541 return gl::error(GL_INVALID_OPERATION);
6542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006543
Geoff Lang37dde692014-01-31 16:34:54 -05006544 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006545 {
Geoff Lang37dde692014-01-31 16:34:54 -05006546 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006547 }
Geoff Lang37dde692014-01-31 16:34:54 -05006548
6549 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006551 }
6552 catch(std::bad_alloc&)
6553 {
6554 return gl::error(GL_OUT_OF_MEMORY);
6555 }
6556}
6557
6558void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6559{
6560 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6561
6562 try
6563 {
6564 gl::Context *context = gl::getNonLostContext();
6565
6566 if (context)
6567 {
6568 if (context->getClientVersion() < 3)
6569 {
6570 return gl::error(GL_INVALID_OPERATION);
6571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006572
Geoff Lang37dde692014-01-31 16:34:54 -05006573 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006574 {
Geoff Lang37dde692014-01-31 16:34:54 -05006575 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006576 }
Geoff Lang37dde692014-01-31 16:34:54 -05006577
6578 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006579 {
Geoff Lang37dde692014-01-31 16:34:54 -05006580 case GL_CURRENT_QUERY:
6581 params[0] = context->getActiveQuery(target);
6582 break;
6583
6584 default:
6585 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006586 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006588 }
6589 catch(std::bad_alloc&)
6590 {
6591 return gl::error(GL_OUT_OF_MEMORY);
6592 }
6593}
6594
6595void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6596{
6597 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6598
6599 try
6600 {
6601 gl::Context *context = gl::getNonLostContext();
6602
6603 if (context)
6604 {
6605 if (context->getClientVersion() < 3)
6606 {
6607 return gl::error(GL_INVALID_OPERATION);
6608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006609
Geoff Lang37dde692014-01-31 16:34:54 -05006610 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6611
6612 if (!queryObject)
6613 {
6614 return gl::error(GL_INVALID_OPERATION);
6615 }
6616
6617 if (context->getActiveQuery(queryObject->getType()) == id)
6618 {
6619 return gl::error(GL_INVALID_OPERATION);
6620 }
6621
6622 switch(pname)
6623 {
6624 case GL_QUERY_RESULT:
6625 params[0] = queryObject->getResult();
6626 break;
6627 case GL_QUERY_RESULT_AVAILABLE:
6628 params[0] = queryObject->isResultAvailable();
6629 break;
6630 default:
6631 return gl::error(GL_INVALID_ENUM);
6632 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006634 }
6635 catch(std::bad_alloc&)
6636 {
6637 return gl::error(GL_OUT_OF_MEMORY);
6638 }
6639}
6640
6641GLboolean __stdcall glUnmapBuffer(GLenum target)
6642{
6643 EVENT("(GLenum target = 0x%X)", target);
6644
6645 try
6646 {
6647 gl::Context *context = gl::getNonLostContext();
6648
6649 if (context)
6650 {
6651 if (context->getClientVersion() < 3)
6652 {
6653 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006655
Jamie Madill54133512013-06-21 09:33:07 -04006656 // glUnmapBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006657 UNIMPLEMENTED();
6658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006659 }
6660 catch(std::bad_alloc&)
6661 {
6662 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6663 }
6664
6665 return GL_FALSE;
6666}
6667
6668void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6669{
6670 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6671
6672 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
Jamie Madill54133512013-06-21 09:33:07 -04006683 // glGetBufferPointerv
shannonwoods@chromium.org2d2190a2013-05-30 00:17:35 +00006684 UNIMPLEMENTED();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006685 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006686 }
6687 catch(std::bad_alloc&)
6688 {
6689 return gl::error(GL_OUT_OF_MEMORY);
6690 }
6691}
6692
6693void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6694{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006695 try
6696 {
6697 gl::Context *context = gl::getNonLostContext();
6698
6699 if (context)
6700 {
6701 if (context->getClientVersion() < 3)
6702 {
6703 return gl::error(GL_INVALID_OPERATION);
6704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006705
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006706 glDrawBuffersEXT(n, bufs);
6707 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006708 }
6709 catch(std::bad_alloc&)
6710 {
6711 return gl::error(GL_OUT_OF_MEMORY);
6712 }
6713}
6714
6715void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6716{
6717 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6718 location, count, transpose, value);
6719
6720 try
6721 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006722 if (count < 0)
6723 {
6724 return gl::error(GL_INVALID_VALUE);
6725 }
6726
6727 if (location == -1)
6728 {
6729 return;
6730 }
6731
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006732 gl::Context *context = gl::getNonLostContext();
6733
6734 if (context)
6735 {
6736 if (context->getClientVersion() < 3)
6737 {
6738 return gl::error(GL_INVALID_OPERATION);
6739 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006740
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006741 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6742 if (!programBinary)
6743 {
6744 return gl::error(GL_INVALID_OPERATION);
6745 }
6746
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006747 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006748 {
6749 return gl::error(GL_INVALID_OPERATION);
6750 }
6751 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006752 }
6753 catch(std::bad_alloc&)
6754 {
6755 return gl::error(GL_OUT_OF_MEMORY);
6756 }
6757}
6758
6759void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6760{
6761 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6762 location, count, transpose, value);
6763
6764 try
6765 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006766 if (count < 0)
6767 {
6768 return gl::error(GL_INVALID_VALUE);
6769 }
6770
6771 if (location == -1)
6772 {
6773 return;
6774 }
6775
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006776 gl::Context *context = gl::getNonLostContext();
6777
6778 if (context)
6779 {
6780 if (context->getClientVersion() < 3)
6781 {
6782 return gl::error(GL_INVALID_OPERATION);
6783 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006784
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006785 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6786 if (!programBinary)
6787 {
6788 return gl::error(GL_INVALID_OPERATION);
6789 }
6790
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006791 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006792 {
6793 return gl::error(GL_INVALID_OPERATION);
6794 }
6795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006796 }
6797 catch(std::bad_alloc&)
6798 {
6799 return gl::error(GL_OUT_OF_MEMORY);
6800 }
6801}
6802
6803void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6804{
6805 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6806 location, count, transpose, value);
6807
6808 try
6809 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006810 if (count < 0)
6811 {
6812 return gl::error(GL_INVALID_VALUE);
6813 }
6814
6815 if (location == -1)
6816 {
6817 return;
6818 }
6819
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006820 gl::Context *context = gl::getNonLostContext();
6821
6822 if (context)
6823 {
6824 if (context->getClientVersion() < 3)
6825 {
6826 return gl::error(GL_INVALID_OPERATION);
6827 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006828
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006829 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6830 if (!programBinary)
6831 {
6832 return gl::error(GL_INVALID_OPERATION);
6833 }
6834
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006835 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006836 {
6837 return gl::error(GL_INVALID_OPERATION);
6838 }
6839 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006840 }
6841 catch(std::bad_alloc&)
6842 {
6843 return gl::error(GL_OUT_OF_MEMORY);
6844 }
6845}
6846
6847void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6848{
6849 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6850 location, count, transpose, value);
6851
6852 try
6853 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006854 if (count < 0)
6855 {
6856 return gl::error(GL_INVALID_VALUE);
6857 }
6858
6859 if (location == -1)
6860 {
6861 return;
6862 }
6863
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006864 gl::Context *context = gl::getNonLostContext();
6865
6866 if (context)
6867 {
6868 if (context->getClientVersion() < 3)
6869 {
6870 return gl::error(GL_INVALID_OPERATION);
6871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006872
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006873 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6874 if (!programBinary)
6875 {
6876 return gl::error(GL_INVALID_OPERATION);
6877 }
6878
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006879 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006880 {
6881 return gl::error(GL_INVALID_OPERATION);
6882 }
6883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006884 }
6885 catch(std::bad_alloc&)
6886 {
6887 return gl::error(GL_OUT_OF_MEMORY);
6888 }
6889}
6890
6891void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6892{
6893 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6894 location, count, transpose, value);
6895
6896 try
6897 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006898 if (count < 0)
6899 {
6900 return gl::error(GL_INVALID_VALUE);
6901 }
6902
6903 if (location == -1)
6904 {
6905 return;
6906 }
6907
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006908 gl::Context *context = gl::getNonLostContext();
6909
6910 if (context)
6911 {
6912 if (context->getClientVersion() < 3)
6913 {
6914 return gl::error(GL_INVALID_OPERATION);
6915 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006916
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006917 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6918 if (!programBinary)
6919 {
6920 return gl::error(GL_INVALID_OPERATION);
6921 }
6922
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006923 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006924 {
6925 return gl::error(GL_INVALID_OPERATION);
6926 }
6927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006928 }
6929 catch(std::bad_alloc&)
6930 {
6931 return gl::error(GL_OUT_OF_MEMORY);
6932 }
6933}
6934
6935void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6936{
6937 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6938 location, count, transpose, value);
6939
6940 try
6941 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006942 if (count < 0)
6943 {
6944 return gl::error(GL_INVALID_VALUE);
6945 }
6946
6947 if (location == -1)
6948 {
6949 return;
6950 }
6951
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006952 gl::Context *context = gl::getNonLostContext();
6953
6954 if (context)
6955 {
6956 if (context->getClientVersion() < 3)
6957 {
6958 return gl::error(GL_INVALID_OPERATION);
6959 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006960
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006961 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6962 if (!programBinary)
6963 {
6964 return gl::error(GL_INVALID_OPERATION);
6965 }
6966
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006967 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006968 {
6969 return gl::error(GL_INVALID_OPERATION);
6970 }
6971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006972 }
6973 catch(std::bad_alloc&)
6974 {
6975 return gl::error(GL_OUT_OF_MEMORY);
6976 }
6977}
6978
6979void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6980{
6981 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6982 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6983 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6984
6985 try
6986 {
6987 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006988 if (context)
6989 {
6990 if (context->getClientVersion() < 3)
6991 {
6992 return gl::error(GL_INVALID_OPERATION);
6993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006994
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006995 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006996 dstX0, dstY0, dstX1, dstY1, mask, filter,
6997 false))
6998 {
6999 return;
7000 }
7001
7002 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7003 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007005 }
7006 catch(std::bad_alloc&)
7007 {
7008 return gl::error(GL_OUT_OF_MEMORY);
7009 }
7010}
7011
7012void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7013{
7014 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7015 target, samples, internalformat, width, height);
7016
7017 try
7018 {
7019 gl::Context *context = gl::getNonLostContext();
7020
7021 if (context)
7022 {
7023 if (context->getClientVersion() < 3)
7024 {
7025 return gl::error(GL_INVALID_OPERATION);
7026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007027
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007028 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007029 width, height, false))
7030 {
7031 return;
7032 }
7033
7034 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007035 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007036 }
7037 catch(std::bad_alloc&)
7038 {
7039 return gl::error(GL_OUT_OF_MEMORY);
7040 }
7041}
7042
7043void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7044{
7045 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7046 target, attachment, texture, level, layer);
7047
7048 try
7049 {
7050 gl::Context *context = gl::getNonLostContext();
7051
7052 if (context)
7053 {
7054 if (context->getClientVersion() < 3)
7055 {
7056 return gl::error(GL_INVALID_OPERATION);
7057 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007058
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007059 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007060 {
7061 return;
7062 }
7063
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007064 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7065 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007066
7067 gl::Texture *textureObject = context->getTexture(texture);
7068 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7069
7070 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7071 {
7072 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7073 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7074 }
7075 else
7076 {
7077 switch (attachment)
7078 {
7079 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7080 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7081 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7082 }
7083 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007084 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007085 }
7086 catch(std::bad_alloc&)
7087 {
7088 return gl::error(GL_OUT_OF_MEMORY);
7089 }
7090}
7091
7092GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7093{
7094 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7095 target, offset, length, access);
7096
7097 try
7098 {
7099 gl::Context *context = gl::getNonLostContext();
7100
7101 if (context)
7102 {
7103 if (context->getClientVersion() < 3)
7104 {
7105 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007107
Jamie Madill54133512013-06-21 09:33:07 -04007108 // glMapBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007109 UNIMPLEMENTED();
7110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007111 }
7112 catch(std::bad_alloc&)
7113 {
7114 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7115 }
7116
7117 return NULL;
7118}
7119
7120void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7121{
7122 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7123
7124 try
7125 {
7126 gl::Context *context = gl::getNonLostContext();
7127
7128 if (context)
7129 {
7130 if (context->getClientVersion() < 3)
7131 {
7132 return gl::error(GL_INVALID_OPERATION);
7133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007134
Jamie Madill54133512013-06-21 09:33:07 -04007135 // glFlushMappedBufferRange
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007136 UNIMPLEMENTED();
7137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007138 }
7139 catch(std::bad_alloc&)
7140 {
7141 return gl::error(GL_OUT_OF_MEMORY);
7142 }
7143}
7144
7145void __stdcall glBindVertexArray(GLuint array)
7146{
7147 EVENT("(GLuint array = %u)", array);
7148
7149 try
7150 {
7151 gl::Context *context = gl::getNonLostContext();
7152
7153 if (context)
7154 {
7155 if (context->getClientVersion() < 3)
7156 {
7157 return gl::error(GL_INVALID_OPERATION);
7158 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007159
Jamie Madilld1028542013-07-02 11:57:04 -04007160 gl::VertexArray *vao = context->getVertexArray(array);
7161
7162 if (!vao)
7163 {
7164 // The default VAO should always exist
7165 ASSERT(array != 0);
7166 return gl::error(GL_INVALID_OPERATION);
7167 }
7168
7169 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007171 }
7172 catch(std::bad_alloc&)
7173 {
7174 return gl::error(GL_OUT_OF_MEMORY);
7175 }
7176}
7177
7178void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7179{
7180 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7181
7182 try
7183 {
7184 gl::Context *context = gl::getNonLostContext();
7185
7186 if (context)
7187 {
7188 if (context->getClientVersion() < 3)
7189 {
7190 return gl::error(GL_INVALID_OPERATION);
7191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007192
Jamie Madilld1028542013-07-02 11:57:04 -04007193 if (n < 0)
7194 {
7195 return gl::error(GL_INVALID_VALUE);
7196 }
7197
7198 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7199 {
7200 if (arrays[arrayIndex] != 0)
7201 {
7202 context->deleteVertexArray(arrays[arrayIndex]);
7203 }
7204 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007206 }
7207 catch(std::bad_alloc&)
7208 {
7209 return gl::error(GL_OUT_OF_MEMORY);
7210 }
7211}
7212
7213void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7214{
7215 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7216
7217 try
7218 {
7219 gl::Context *context = gl::getNonLostContext();
7220
7221 if (context)
7222 {
7223 if (context->getClientVersion() < 3)
7224 {
7225 return gl::error(GL_INVALID_OPERATION);
7226 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007227
Jamie Madilld1028542013-07-02 11:57:04 -04007228 if (n < 0)
7229 {
7230 return gl::error(GL_INVALID_VALUE);
7231 }
7232
7233 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7234 {
7235 arrays[arrayIndex] = context->createVertexArray();
7236 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007237 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007238 }
7239 catch(std::bad_alloc&)
7240 {
7241 return gl::error(GL_OUT_OF_MEMORY);
7242 }
7243}
7244
7245GLboolean __stdcall glIsVertexArray(GLuint array)
7246{
7247 EVENT("(GLuint array = %u)", array);
7248
7249 try
7250 {
7251 gl::Context *context = gl::getNonLostContext();
7252
7253 if (context)
7254 {
7255 if (context->getClientVersion() < 3)
7256 {
7257 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7258 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007259
Jamie Madilld1028542013-07-02 11:57:04 -04007260 if (array == 0)
7261 {
7262 return GL_FALSE;
7263 }
7264
7265 gl::VertexArray *vao = context->getVertexArray(array);
7266
7267 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007269 }
7270 catch(std::bad_alloc&)
7271 {
7272 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7273 }
7274
7275 return GL_FALSE;
7276}
7277
7278void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7279{
7280 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7281 target, index, data);
7282
7283 try
7284 {
7285 gl::Context *context = gl::getNonLostContext();
7286
7287 if (context)
7288 {
7289 if (context->getClientVersion() < 3)
7290 {
7291 return gl::error(GL_INVALID_OPERATION);
7292 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007293
Shannon Woods15934d52013-08-19 14:28:49 -04007294 switch (target)
7295 {
7296 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7297 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7298 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7299 if (index >= context->getMaxTransformFeedbackBufferBindings())
7300 return gl::error(GL_INVALID_VALUE);
7301 break;
7302 case GL_UNIFORM_BUFFER_START:
7303 case GL_UNIFORM_BUFFER_SIZE:
7304 case GL_UNIFORM_BUFFER_BINDING:
7305 if (index >= context->getMaximumCombinedUniformBufferBindings())
7306 return gl::error(GL_INVALID_VALUE);
7307 break;
7308 default:
7309 return gl::error(GL_INVALID_ENUM);
7310 }
7311
7312 if (!(context->getIndexedIntegerv(target, index, data)))
7313 {
7314 GLenum nativeType;
7315 unsigned int numParams = 0;
7316 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7317 return gl::error(GL_INVALID_ENUM);
7318
7319 if (numParams == 0)
7320 return; // it is known that pname is valid, but there are no parameters to return
7321
7322 if (nativeType == GL_INT_64_ANGLEX)
7323 {
7324 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7325 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7326 GLint64 *int64Params = new GLint64[numParams];
7327
7328 context->getIndexedInteger64v(target, index, int64Params);
7329
7330 for (unsigned int i = 0; i < numParams; ++i)
7331 {
7332 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7333 data[i] = static_cast<GLint>(clampedValue);
7334 }
7335
7336 delete [] int64Params;
7337 }
7338 else
7339 {
7340 UNREACHABLE();
7341 }
7342 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007343 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007344 }
7345 catch(std::bad_alloc&)
7346 {
7347 return gl::error(GL_OUT_OF_MEMORY);
7348 }
7349}
7350
7351void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7352{
7353 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
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
Jamie Madill54133512013-06-21 09:33:07 -04007366 // glBeginTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007367 UNIMPLEMENTED();
7368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007369 }
7370 catch(std::bad_alloc&)
7371 {
7372 return gl::error(GL_OUT_OF_MEMORY);
7373 }
7374}
7375
7376void __stdcall glEndTransformFeedback(void)
7377{
7378 EVENT("(void)");
7379
7380 try
7381 {
7382 gl::Context *context = gl::getNonLostContext();
7383
7384 if (context)
7385 {
7386 if (context->getClientVersion() < 3)
7387 {
7388 return gl::error(GL_INVALID_OPERATION);
7389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007390
Jamie Madill54133512013-06-21 09:33:07 -04007391 // glEndTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007392 UNIMPLEMENTED();
7393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007394 }
7395 catch(std::bad_alloc&)
7396 {
7397 return gl::error(GL_OUT_OF_MEMORY);
7398 }
7399}
7400
7401void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7402{
7403 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7404 target, index, buffer, offset, size);
7405
7406 try
7407 {
7408 gl::Context *context = gl::getNonLostContext();
7409
7410 if (context)
7411 {
7412 if (context->getClientVersion() < 3)
7413 {
7414 return gl::error(GL_INVALID_OPERATION);
7415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007416
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007417 switch (target)
7418 {
7419 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007420 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007421 {
7422 return gl::error(GL_INVALID_VALUE);
7423 }
7424 break;
7425
7426 case GL_UNIFORM_BUFFER:
7427 if (index >= context->getMaximumCombinedUniformBufferBindings())
7428 {
7429 return gl::error(GL_INVALID_VALUE);
7430 }
7431 break;
7432
7433 default:
7434 return gl::error(GL_INVALID_ENUM);
7435 }
7436
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007437 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007438 {
7439 return gl::error(GL_INVALID_VALUE);
7440 }
7441
7442 switch (target)
7443 {
7444 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007445
7446 // size and offset must be a multiple of 4
7447 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7448 {
7449 return gl::error(GL_INVALID_VALUE);
7450 }
7451
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007452 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7453 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007454 break;
7455
7456 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007457
7458 // it is an error to bind an offset not a multiple of the alignment
7459 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7460 {
7461 return gl::error(GL_INVALID_VALUE);
7462 }
7463
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007464 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7465 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007466 break;
7467
7468 default:
7469 UNREACHABLE();
7470 }
7471 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007472 }
7473 catch(std::bad_alloc&)
7474 {
7475 return gl::error(GL_OUT_OF_MEMORY);
7476 }
7477}
7478
7479void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7480{
7481 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7482 target, index, buffer);
7483
7484 try
7485 {
7486 gl::Context *context = gl::getNonLostContext();
7487
7488 if (context)
7489 {
7490 if (context->getClientVersion() < 3)
7491 {
7492 return gl::error(GL_INVALID_OPERATION);
7493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007494
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007495 switch (target)
7496 {
7497 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007498 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007499 {
7500 return gl::error(GL_INVALID_VALUE);
7501 }
7502 break;
7503
7504 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007505 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007506 {
7507 return gl::error(GL_INVALID_VALUE);
7508 }
7509 break;
7510
7511 default:
7512 return gl::error(GL_INVALID_ENUM);
7513 }
7514
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007515 switch (target)
7516 {
7517 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007518 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007519 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007520 break;
7521
7522 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007523 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007524 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007525 break;
7526
7527 default:
7528 UNREACHABLE();
7529 }
7530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007531 }
7532 catch(std::bad_alloc&)
7533 {
7534 return gl::error(GL_OUT_OF_MEMORY);
7535 }
7536}
7537
7538void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7539{
7540 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7541 program, count, varyings, bufferMode);
7542
7543 try
7544 {
7545 gl::Context *context = gl::getNonLostContext();
7546
7547 if (context)
7548 {
7549 if (context->getClientVersion() < 3)
7550 {
7551 return gl::error(GL_INVALID_OPERATION);
7552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007553
Jamie Madill54133512013-06-21 09:33:07 -04007554 // glTransformFeedbackVaryings
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007555 UNIMPLEMENTED();
7556 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007557 }
7558 catch(std::bad_alloc&)
7559 {
7560 return gl::error(GL_OUT_OF_MEMORY);
7561 }
7562}
7563
7564void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7565{
7566 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7567 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7568 program, index, bufSize, length, size, type, name);
7569
7570 try
7571 {
7572 gl::Context *context = gl::getNonLostContext();
7573
7574 if (context)
7575 {
7576 if (context->getClientVersion() < 3)
7577 {
7578 return gl::error(GL_INVALID_OPERATION);
7579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007580
Jamie Madill54133512013-06-21 09:33:07 -04007581 // glGetTransformFeedbackVarying
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007582 UNIMPLEMENTED();
7583 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007584 }
7585 catch(std::bad_alloc&)
7586 {
7587 return gl::error(GL_OUT_OF_MEMORY);
7588 }
7589}
7590
7591void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7592{
7593 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7594 index, size, type, stride, pointer);
7595
7596 try
7597 {
7598 gl::Context *context = gl::getNonLostContext();
7599
7600 if (context)
7601 {
7602 if (context->getClientVersion() < 3)
7603 {
7604 return gl::error(GL_INVALID_OPERATION);
7605 }
7606 }
7607
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007608 if (index >= gl::MAX_VERTEX_ATTRIBS)
7609 {
7610 return gl::error(GL_INVALID_VALUE);
7611 }
7612
7613 if (size < 1 || size > 4)
7614 {
7615 return gl::error(GL_INVALID_VALUE);
7616 }
7617
7618 switch (type)
7619 {
7620 case GL_BYTE:
7621 case GL_UNSIGNED_BYTE:
7622 case GL_SHORT:
7623 case GL_UNSIGNED_SHORT:
7624 case GL_INT:
7625 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007626 case GL_INT_2_10_10_10_REV:
7627 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007628 break;
7629 default:
7630 return gl::error(GL_INVALID_ENUM);
7631 }
7632
7633 if (stride < 0)
7634 {
7635 return gl::error(GL_INVALID_VALUE);
7636 }
7637
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007638 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7639 {
7640 return gl::error(GL_INVALID_OPERATION);
7641 }
7642
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007643 if (context)
7644 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007645 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7646 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7647 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7648 // and the pointer argument is not NULL.
7649 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7650 {
7651 return gl::error(GL_INVALID_OPERATION);
7652 }
7653
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007654 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7655 stride, pointer);
7656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657 }
7658 catch(std::bad_alloc&)
7659 {
7660 return gl::error(GL_OUT_OF_MEMORY);
7661 }
7662}
7663
7664void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7665{
7666 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7667 index, pname, params);
7668
7669 try
7670 {
7671 gl::Context *context = gl::getNonLostContext();
7672
7673 if (context)
7674 {
7675 if (context->getClientVersion() < 3)
7676 {
7677 return gl::error(GL_INVALID_OPERATION);
7678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007679
Jamie Madilla7d05862013-07-02 11:57:06 -04007680 if (index >= gl::MAX_VERTEX_ATTRIBS)
7681 {
7682 return gl::error(GL_INVALID_VALUE);
7683 }
7684
7685 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7686
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007687 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007688 {
7689 return;
7690 }
7691
7692 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7693 {
7694 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7695 for (int i = 0; i < 4; ++i)
7696 {
7697 params[i] = currentValueData.IntValues[i];
7698 }
7699 }
7700 else
7701 {
7702 *params = attribState.querySingleParameter<GLint>(pname);
7703 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007705 }
7706 catch(std::bad_alloc&)
7707 {
7708 return gl::error(GL_OUT_OF_MEMORY);
7709 }
7710}
7711
7712void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7713{
7714 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7715 index, pname, params);
7716
7717 try
7718 {
7719 gl::Context *context = gl::getNonLostContext();
7720
7721 if (context)
7722 {
7723 if (context->getClientVersion() < 3)
7724 {
7725 return gl::error(GL_INVALID_OPERATION);
7726 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007727
Jamie Madilla7d05862013-07-02 11:57:06 -04007728 if (index >= gl::MAX_VERTEX_ATTRIBS)
7729 {
7730 return gl::error(GL_INVALID_VALUE);
7731 }
7732
7733 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7734
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007735 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007736 {
7737 return;
7738 }
7739
7740 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7741 {
7742 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7743 for (int i = 0; i < 4; ++i)
7744 {
7745 params[i] = currentValueData.UnsignedIntValues[i];
7746 }
7747 }
7748 else
7749 {
7750 *params = attribState.querySingleParameter<GLuint>(pname);
7751 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007752 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007753 }
7754 catch(std::bad_alloc&)
7755 {
7756 return gl::error(GL_OUT_OF_MEMORY);
7757 }
7758}
7759
7760void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7761{
7762 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7763 index, x, y, z, w);
7764
7765 try
7766 {
7767 gl::Context *context = gl::getNonLostContext();
7768
7769 if (context)
7770 {
7771 if (context->getClientVersion() < 3)
7772 {
7773 return gl::error(GL_INVALID_OPERATION);
7774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007775
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007776 if (index >= gl::MAX_VERTEX_ATTRIBS)
7777 {
7778 return gl::error(GL_INVALID_VALUE);
7779 }
7780
7781 GLint vals[4] = { x, y, z, w };
7782 context->setVertexAttribi(index, vals);
7783 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007784 }
7785 catch(std::bad_alloc&)
7786 {
7787 return gl::error(GL_OUT_OF_MEMORY);
7788 }
7789}
7790
7791void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7792{
7793 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7794 index, x, y, z, w);
7795
7796 try
7797 {
7798 gl::Context *context = gl::getNonLostContext();
7799
7800 if (context)
7801 {
7802 if (context->getClientVersion() < 3)
7803 {
7804 return gl::error(GL_INVALID_OPERATION);
7805 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007806
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007807 if (index >= gl::MAX_VERTEX_ATTRIBS)
7808 {
7809 return gl::error(GL_INVALID_VALUE);
7810 }
7811
7812 GLuint vals[4] = { x, y, z, w };
7813 context->setVertexAttribu(index, vals);
7814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007815 }
7816 catch(std::bad_alloc&)
7817 {
7818 return gl::error(GL_OUT_OF_MEMORY);
7819 }
7820}
7821
7822void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7823{
7824 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7825
7826 try
7827 {
7828 gl::Context *context = gl::getNonLostContext();
7829
7830 if (context)
7831 {
7832 if (context->getClientVersion() < 3)
7833 {
7834 return gl::error(GL_INVALID_OPERATION);
7835 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007836
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007837 if (index >= gl::MAX_VERTEX_ATTRIBS)
7838 {
7839 return gl::error(GL_INVALID_VALUE);
7840 }
7841
7842 context->setVertexAttribi(index, v);
7843 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844 }
7845 catch(std::bad_alloc&)
7846 {
7847 return gl::error(GL_OUT_OF_MEMORY);
7848 }
7849}
7850
7851void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7852{
7853 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7854
7855 try
7856 {
7857 gl::Context *context = gl::getNonLostContext();
7858
7859 if (context)
7860 {
7861 if (context->getClientVersion() < 3)
7862 {
7863 return gl::error(GL_INVALID_OPERATION);
7864 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007865
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007866 if (index >= gl::MAX_VERTEX_ATTRIBS)
7867 {
7868 return gl::error(GL_INVALID_VALUE);
7869 }
7870
7871 context->setVertexAttribu(index, v);
7872 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007873 }
7874 catch(std::bad_alloc&)
7875 {
7876 return gl::error(GL_OUT_OF_MEMORY);
7877 }
7878}
7879
7880void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7881{
7882 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7883 program, location, params);
7884
7885 try
7886 {
7887 gl::Context *context = gl::getNonLostContext();
7888
7889 if (context)
7890 {
7891 if (context->getClientVersion() < 3)
7892 {
7893 return gl::error(GL_INVALID_OPERATION);
7894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007895
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007896 if (program == 0)
7897 {
7898 return gl::error(GL_INVALID_VALUE);
7899 }
7900
7901 gl::Program *programObject = context->getProgram(program);
7902
7903 if (!programObject || !programObject->isLinked())
7904 {
7905 return gl::error(GL_INVALID_OPERATION);
7906 }
7907
7908 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7909 if (!programBinary)
7910 {
7911 return gl::error(GL_INVALID_OPERATION);
7912 }
7913
7914 if (!programBinary->getUniformuiv(location, NULL, params))
7915 {
7916 return gl::error(GL_INVALID_OPERATION);
7917 }
7918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007919 }
7920 catch(std::bad_alloc&)
7921 {
7922 return gl::error(GL_OUT_OF_MEMORY);
7923 }
7924}
7925
7926GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7927{
7928 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7929 program, name);
7930
7931 try
7932 {
7933 gl::Context *context = gl::getNonLostContext();
7934
7935 if (context)
7936 {
7937 if (context->getClientVersion() < 3)
7938 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007939 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007940 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007941
Jamie Madilld1e78c92013-06-20 11:55:50 -04007942 if (program == 0)
7943 {
7944 return gl::error(GL_INVALID_VALUE, -1);
7945 }
7946
7947 gl::Program *programObject = context->getProgram(program);
7948
7949 if (!programObject || !programObject->isLinked())
7950 {
7951 return gl::error(GL_INVALID_OPERATION, -1);
7952 }
7953
7954 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7955 if (!programBinary)
7956 {
7957 return gl::error(GL_INVALID_OPERATION, -1);
7958 }
7959
7960 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007962 }
7963 catch(std::bad_alloc&)
7964 {
7965 return gl::error(GL_OUT_OF_MEMORY, 0);
7966 }
7967
7968 return 0;
7969}
7970
7971void __stdcall glUniform1ui(GLint location, GLuint v0)
7972{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007973 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007974}
7975
7976void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7977{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007978 const GLuint xy[] = { v0, v1 };
7979 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007980}
7981
7982void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7983{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007984 const GLuint xyz[] = { v0, v1, v2 };
7985 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007986}
7987
7988void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7989{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007990 const GLuint xyzw[] = { v0, v1, v2, v3 };
7991 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007992}
7993
7994void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7995{
7996 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7997 location, count, value);
7998
7999 try
8000 {
8001 gl::Context *context = gl::getNonLostContext();
8002
8003 if (context)
8004 {
8005 if (context->getClientVersion() < 3)
8006 {
8007 return gl::error(GL_INVALID_OPERATION);
8008 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008009
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008010 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8011 if (!programBinary)
8012 {
8013 return gl::error(GL_INVALID_OPERATION);
8014 }
8015
8016 if (!programBinary->setUniform1uiv(location, count, value))
8017 {
8018 return gl::error(GL_INVALID_OPERATION);
8019 }
8020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008021 }
8022 catch(std::bad_alloc&)
8023 {
8024 return gl::error(GL_OUT_OF_MEMORY);
8025 }
8026}
8027
8028void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8029{
8030 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8031 location, count, value);
8032
8033 try
8034 {
8035 gl::Context *context = gl::getNonLostContext();
8036
8037 if (context)
8038 {
8039 if (context->getClientVersion() < 3)
8040 {
8041 return gl::error(GL_INVALID_OPERATION);
8042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008043
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008044 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8045 if (!programBinary)
8046 {
8047 return gl::error(GL_INVALID_OPERATION);
8048 }
8049
8050 if (!programBinary->setUniform2uiv(location, count, value))
8051 {
8052 return gl::error(GL_INVALID_OPERATION);
8053 }
8054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008055 }
8056 catch(std::bad_alloc&)
8057 {
8058 return gl::error(GL_OUT_OF_MEMORY);
8059 }
8060}
8061
8062void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8063{
8064 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8065 location, count, value);
8066
8067 try
8068 {
8069 gl::Context *context = gl::getNonLostContext();
8070
8071 if (context)
8072 {
8073 if (context->getClientVersion() < 3)
8074 {
8075 return gl::error(GL_INVALID_OPERATION);
8076 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008077
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008078 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8079 if (!programBinary)
8080 {
8081 return gl::error(GL_INVALID_OPERATION);
8082 }
8083
8084 if (!programBinary->setUniform3uiv(location, count, value))
8085 {
8086 return gl::error(GL_INVALID_OPERATION);
8087 }
8088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008089 }
8090 catch(std::bad_alloc&)
8091 {
8092 return gl::error(GL_OUT_OF_MEMORY);
8093 }
8094}
8095
8096void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8097{
8098 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8099 location, count, value);
8100
8101 try
8102 {
8103 gl::Context *context = gl::getNonLostContext();
8104
8105 if (context)
8106 {
8107 if (context->getClientVersion() < 3)
8108 {
8109 return gl::error(GL_INVALID_OPERATION);
8110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008111
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008112 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8113 if (!programBinary)
8114 {
8115 return gl::error(GL_INVALID_OPERATION);
8116 }
8117
8118 if (!programBinary->setUniform4uiv(location, count, value))
8119 {
8120 return gl::error(GL_INVALID_OPERATION);
8121 }
8122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008123 }
8124 catch(std::bad_alloc&)
8125 {
8126 return gl::error(GL_OUT_OF_MEMORY);
8127 }
8128}
8129
8130void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8131{
8132 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8133 buffer, drawbuffer, value);
8134
8135 try
8136 {
8137 gl::Context *context = gl::getNonLostContext();
8138
8139 if (context)
8140 {
8141 if (context->getClientVersion() < 3)
8142 {
8143 return gl::error(GL_INVALID_OPERATION);
8144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008145
Geoff Lang42359ca2013-08-21 13:25:17 -04008146 switch (buffer)
8147 {
8148 case GL_COLOR:
8149 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8150 {
8151 return gl::error(GL_INVALID_VALUE);
8152 }
8153 break;
8154 case GL_STENCIL:
8155 if (drawbuffer != 0)
8156 {
8157 return gl::error(GL_INVALID_VALUE);
8158 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008159 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008160 default:
8161 return gl::error(GL_INVALID_ENUM);
8162 }
8163
8164 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008165 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008166 }
8167 catch(std::bad_alloc&)
8168 {
8169 return gl::error(GL_OUT_OF_MEMORY);
8170 }
8171}
8172
8173void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8174{
8175 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8176 buffer, drawbuffer, value);
8177
8178 try
8179 {
8180 gl::Context *context = gl::getNonLostContext();
8181
8182 if (context)
8183 {
8184 if (context->getClientVersion() < 3)
8185 {
8186 return gl::error(GL_INVALID_OPERATION);
8187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008188
Geoff Lang42359ca2013-08-21 13:25:17 -04008189 switch (buffer)
8190 {
8191 case GL_COLOR:
8192 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8193 {
8194 return gl::error(GL_INVALID_VALUE);
8195 }
8196 break;
8197 default:
8198 return gl::error(GL_INVALID_ENUM);
8199 }
8200
8201 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008202 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008203 }
8204 catch(std::bad_alloc&)
8205 {
8206 return gl::error(GL_OUT_OF_MEMORY);
8207 }
8208}
8209
8210void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8211{
8212 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8213 buffer, drawbuffer, value);
8214
8215 try
8216 {
8217 gl::Context *context = gl::getNonLostContext();
8218
8219 if (context)
8220 {
8221 if (context->getClientVersion() < 3)
8222 {
8223 return gl::error(GL_INVALID_OPERATION);
8224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008225
Geoff Lang42359ca2013-08-21 13:25:17 -04008226 switch (buffer)
8227 {
8228 case GL_COLOR:
8229 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8230 {
8231 return gl::error(GL_INVALID_VALUE);
8232 }
8233 break;
8234 case GL_DEPTH:
8235 if (drawbuffer != 0)
8236 {
8237 return gl::error(GL_INVALID_VALUE);
8238 }
8239 break;
8240 default:
8241 return gl::error(GL_INVALID_ENUM);
8242 }
8243
8244 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008245 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008246 }
8247 catch(std::bad_alloc&)
8248 {
8249 return gl::error(GL_OUT_OF_MEMORY);
8250 }
8251}
8252
8253void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8254{
8255 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8256 buffer, drawbuffer, depth, stencil);
8257
8258 try
8259 {
8260 gl::Context *context = gl::getNonLostContext();
8261
8262 if (context)
8263 {
8264 if (context->getClientVersion() < 3)
8265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008268
Geoff Lang42359ca2013-08-21 13:25:17 -04008269 switch (buffer)
8270 {
8271 case GL_DEPTH_STENCIL:
8272 if (drawbuffer != 0)
8273 {
8274 return gl::error(GL_INVALID_VALUE);
8275 }
8276 break;
8277 default:
8278 return gl::error(GL_INVALID_ENUM);
8279 }
8280
8281 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008283 }
8284 catch(std::bad_alloc&)
8285 {
8286 return gl::error(GL_OUT_OF_MEMORY);
8287 }
8288}
8289
8290const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8291{
8292 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8293
8294 try
8295 {
8296 gl::Context *context = gl::getNonLostContext();
8297
8298 if (context)
8299 {
8300 if (context->getClientVersion() < 3)
8301 {
8302 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008304
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008305 if (name != GL_EXTENSIONS)
8306 {
8307 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8308 }
8309
8310 if (index >= context->getNumExtensions())
8311 {
8312 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8313 }
8314
8315 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8316 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008317 }
8318 catch(std::bad_alloc&)
8319 {
8320 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8321 }
8322
8323 return NULL;
8324}
8325
8326void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8327{
8328 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8329 readTarget, writeTarget, readOffset, writeOffset, size);
8330
8331 try
8332 {
8333 gl::Context *context = gl::getNonLostContext();
8334
8335 if (context)
8336 {
8337 if (context->getClientVersion() < 3)
8338 {
8339 return gl::error(GL_INVALID_OPERATION);
8340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008342 gl::Buffer *readBuffer = NULL;
8343 switch (readTarget)
8344 {
8345 case GL_ARRAY_BUFFER:
8346 readBuffer = context->getArrayBuffer();
8347 break;
8348 case GL_COPY_READ_BUFFER:
8349 readBuffer = context->getCopyReadBuffer();
8350 break;
8351 case GL_COPY_WRITE_BUFFER:
8352 readBuffer = context->getCopyWriteBuffer();
8353 break;
8354 case GL_ELEMENT_ARRAY_BUFFER:
8355 readBuffer = context->getElementArrayBuffer();
8356 break;
8357 case GL_PIXEL_PACK_BUFFER:
8358 readBuffer = context->getPixelPackBuffer();
8359 break;
8360 case GL_PIXEL_UNPACK_BUFFER:
8361 readBuffer = context->getPixelUnpackBuffer();
8362 break;
8363 case GL_TRANSFORM_FEEDBACK_BUFFER:
8364 readBuffer = context->getGenericTransformFeedbackBuffer();
8365 break;
8366 case GL_UNIFORM_BUFFER:
8367 readBuffer = context->getGenericUniformBuffer();
8368 break;
8369 default:
8370 return gl::error(GL_INVALID_ENUM);
8371 }
8372
8373 gl::Buffer *writeBuffer = NULL;
8374 switch (writeTarget)
8375 {
8376 case GL_ARRAY_BUFFER:
8377 writeBuffer = context->getArrayBuffer();
8378 break;
8379 case GL_COPY_READ_BUFFER:
8380 writeBuffer = context->getCopyReadBuffer();
8381 break;
8382 case GL_COPY_WRITE_BUFFER:
8383 writeBuffer = context->getCopyWriteBuffer();
8384 break;
8385 case GL_ELEMENT_ARRAY_BUFFER:
8386 writeBuffer = context->getElementArrayBuffer();
8387 break;
8388 case GL_PIXEL_PACK_BUFFER:
8389 writeBuffer = context->getPixelPackBuffer();
8390 break;
8391 case GL_PIXEL_UNPACK_BUFFER:
8392 writeBuffer = context->getPixelUnpackBuffer();
8393 break;
8394 case GL_TRANSFORM_FEEDBACK_BUFFER:
8395 writeBuffer = context->getGenericTransformFeedbackBuffer();
8396 break;
8397 case GL_UNIFORM_BUFFER:
8398 writeBuffer = context->getGenericUniformBuffer();
8399 break;
8400 default:
8401 return gl::error(GL_INVALID_ENUM);
8402 }
8403
8404 if (!readBuffer || !writeBuffer)
8405 {
8406 return gl::error(GL_INVALID_OPERATION);
8407 }
8408
8409 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8410 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8411 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8412 {
8413 return gl::error(GL_INVALID_VALUE);
8414 }
8415
8416 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8417 {
8418 return gl::error(GL_INVALID_VALUE);
8419 }
8420
8421 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8422
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008423 // if size is zero, the copy is a successful no-op
8424 if (size > 0)
8425 {
8426 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8427 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008429 }
8430 catch(std::bad_alloc&)
8431 {
8432 return gl::error(GL_OUT_OF_MEMORY);
8433 }
8434}
8435
8436void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8437{
8438 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8439 program, uniformCount, uniformNames, uniformIndices);
8440
8441 try
8442 {
8443 gl::Context *context = gl::getNonLostContext();
8444
8445 if (context)
8446 {
8447 if (context->getClientVersion() < 3)
8448 {
8449 return gl::error(GL_INVALID_OPERATION);
8450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008451
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008452 if (uniformCount < 0)
8453 {
8454 return gl::error(GL_INVALID_VALUE);
8455 }
8456
8457 gl::Program *programObject = context->getProgram(program);
8458
8459 if (!programObject)
8460 {
8461 if (context->getShader(program))
8462 {
8463 return gl::error(GL_INVALID_OPERATION);
8464 }
8465 else
8466 {
8467 return gl::error(GL_INVALID_VALUE);
8468 }
8469 }
8470
8471 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8472 if (!programObject->isLinked() || !programBinary)
8473 {
8474 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8475 {
8476 uniformIndices[uniformId] = GL_INVALID_INDEX;
8477 }
8478 }
8479 else
8480 {
8481 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8482 {
8483 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8484 }
8485 }
8486 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008487 }
8488 catch(std::bad_alloc&)
8489 {
8490 return gl::error(GL_OUT_OF_MEMORY);
8491 }
8492}
8493
8494void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8495{
8496 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8497 program, uniformCount, uniformIndices, pname, params);
8498
8499 try
8500 {
8501 gl::Context *context = gl::getNonLostContext();
8502
8503 if (context)
8504 {
8505 if (context->getClientVersion() < 3)
8506 {
8507 return gl::error(GL_INVALID_OPERATION);
8508 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008509
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008510 if (uniformCount < 0)
8511 {
8512 return gl::error(GL_INVALID_VALUE);
8513 }
8514
8515 gl::Program *programObject = context->getProgram(program);
8516
8517 if (!programObject)
8518 {
8519 if (context->getShader(program))
8520 {
8521 return gl::error(GL_INVALID_OPERATION);
8522 }
8523 else
8524 {
8525 return gl::error(GL_INVALID_VALUE);
8526 }
8527 }
8528
8529 switch (pname)
8530 {
8531 case GL_UNIFORM_TYPE:
8532 case GL_UNIFORM_SIZE:
8533 case GL_UNIFORM_NAME_LENGTH:
8534 case GL_UNIFORM_BLOCK_INDEX:
8535 case GL_UNIFORM_OFFSET:
8536 case GL_UNIFORM_ARRAY_STRIDE:
8537 case GL_UNIFORM_MATRIX_STRIDE:
8538 case GL_UNIFORM_IS_ROW_MAJOR:
8539 break;
8540 default:
8541 return gl::error(GL_INVALID_ENUM);
8542 }
8543
8544 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8545
8546 if (!programBinary && uniformCount > 0)
8547 {
8548 return gl::error(GL_INVALID_VALUE);
8549 }
8550
8551 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8552 {
8553 const GLuint index = uniformIndices[uniformId];
8554
8555 if (index >= (GLuint)programBinary->getActiveUniformCount())
8556 {
8557 return gl::error(GL_INVALID_VALUE);
8558 }
8559 }
8560
8561 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8562 {
8563 const GLuint index = uniformIndices[uniformId];
8564 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8565 }
8566 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008567 }
8568 catch(std::bad_alloc&)
8569 {
8570 return gl::error(GL_OUT_OF_MEMORY);
8571 }
8572}
8573
8574GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8575{
8576 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8577
8578 try
8579 {
8580 gl::Context *context = gl::getNonLostContext();
8581
8582 if (context)
8583 {
8584 if (context->getClientVersion() < 3)
8585 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008586 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008588
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008589 gl::Program *programObject = context->getProgram(program);
8590
8591 if (!programObject)
8592 {
8593 if (context->getShader(program))
8594 {
8595 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8596 }
8597 else
8598 {
8599 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8600 }
8601 }
8602
8603 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8604 if (!programBinary)
8605 {
8606 return GL_INVALID_INDEX;
8607 }
8608
8609 return programBinary->getUniformBlockIndex(uniformBlockName);
8610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008611 }
8612 catch(std::bad_alloc&)
8613 {
8614 return gl::error(GL_OUT_OF_MEMORY, 0);
8615 }
8616
8617 return 0;
8618}
8619
8620void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8621{
8622 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8623 program, uniformBlockIndex, pname, params);
8624
8625 try
8626 {
8627 gl::Context *context = gl::getNonLostContext();
8628
8629 if (context)
8630 {
8631 if (context->getClientVersion() < 3)
8632 {
8633 return gl::error(GL_INVALID_OPERATION);
8634 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008635 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008636
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008637 if (!programObject)
8638 {
8639 if (context->getShader(program))
8640 {
8641 return gl::error(GL_INVALID_OPERATION);
8642 }
8643 else
8644 {
8645 return gl::error(GL_INVALID_VALUE);
8646 }
8647 }
8648
8649 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8650
8651 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8652 {
8653 return gl::error(GL_INVALID_VALUE);
8654 }
8655
8656 switch (pname)
8657 {
8658 case GL_UNIFORM_BLOCK_BINDING:
8659 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8660 break;
8661
8662 case GL_UNIFORM_BLOCK_DATA_SIZE:
8663 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8664 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8665 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8666 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8667 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8668 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8669 break;
8670
8671 default:
8672 return gl::error(GL_INVALID_ENUM);
8673 }
8674 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008675 }
8676 catch(std::bad_alloc&)
8677 {
8678 return gl::error(GL_OUT_OF_MEMORY);
8679 }
8680}
8681
8682void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8683{
8684 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8685 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8686
8687 try
8688 {
8689 gl::Context *context = gl::getNonLostContext();
8690
8691 if (context)
8692 {
8693 if (context->getClientVersion() < 3)
8694 {
8695 return gl::error(GL_INVALID_OPERATION);
8696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008697
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008698 gl::Program *programObject = context->getProgram(program);
8699
8700 if (!programObject)
8701 {
8702 if (context->getShader(program))
8703 {
8704 return gl::error(GL_INVALID_OPERATION);
8705 }
8706 else
8707 {
8708 return gl::error(GL_INVALID_VALUE);
8709 }
8710 }
8711
8712 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8713
8714 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8715 {
8716 return gl::error(GL_INVALID_VALUE);
8717 }
8718
8719 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008721 }
8722 catch(std::bad_alloc&)
8723 {
8724 return gl::error(GL_OUT_OF_MEMORY);
8725 }
8726}
8727
8728void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8729{
8730 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8731 program, uniformBlockIndex, uniformBlockBinding);
8732
8733 try
8734 {
8735 gl::Context *context = gl::getNonLostContext();
8736
8737 if (context)
8738 {
8739 if (context->getClientVersion() < 3)
8740 {
8741 return gl::error(GL_INVALID_OPERATION);
8742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008743
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008744 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8745 {
8746 return gl::error(GL_INVALID_VALUE);
8747 }
8748
8749 gl::Program *programObject = context->getProgram(program);
8750
8751 if (!programObject)
8752 {
8753 if (context->getShader(program))
8754 {
8755 return gl::error(GL_INVALID_OPERATION);
8756 }
8757 else
8758 {
8759 return gl::error(GL_INVALID_VALUE);
8760 }
8761 }
8762
8763 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8764
8765 // if never linked, there won't be any uniform blocks
8766 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8767 {
8768 return gl::error(GL_INVALID_VALUE);
8769 }
8770
8771 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008773 }
8774 catch(std::bad_alloc&)
8775 {
8776 return gl::error(GL_OUT_OF_MEMORY);
8777 }
8778}
8779
8780void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8781{
8782 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8783 mode, first, count, instanceCount);
8784
8785 try
8786 {
8787 gl::Context *context = gl::getNonLostContext();
8788
8789 if (context)
8790 {
8791 if (context->getClientVersion() < 3)
8792 {
8793 return gl::error(GL_INVALID_OPERATION);
8794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008795
Jamie Madill54133512013-06-21 09:33:07 -04008796 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008797 UNIMPLEMENTED();
8798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008799 }
8800 catch(std::bad_alloc&)
8801 {
8802 return gl::error(GL_OUT_OF_MEMORY);
8803 }
8804}
8805
8806void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8807{
8808 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8809 mode, count, type, indices, instanceCount);
8810
8811 try
8812 {
8813 gl::Context *context = gl::getNonLostContext();
8814
8815 if (context)
8816 {
8817 if (context->getClientVersion() < 3)
8818 {
8819 return gl::error(GL_INVALID_OPERATION);
8820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008821
Jamie Madill54133512013-06-21 09:33:07 -04008822 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008823 UNIMPLEMENTED();
8824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008825 }
8826 catch(std::bad_alloc&)
8827 {
8828 return gl::error(GL_OUT_OF_MEMORY);
8829 }
8830}
8831
8832GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8833{
8834 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8835
8836 try
8837 {
8838 gl::Context *context = gl::getNonLostContext();
8839
8840 if (context)
8841 {
8842 if (context->getClientVersion() < 3)
8843 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008844 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008845 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008846
Jamie Madill5215e1a2013-07-26 11:55:19 -04008847 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8848 {
8849 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8850 }
8851
8852 if (flags != 0)
8853 {
8854 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8855 }
8856
8857 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859 }
8860 catch(std::bad_alloc&)
8861 {
8862 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8863 }
8864
8865 return NULL;
8866}
8867
8868GLboolean __stdcall glIsSync(GLsync sync)
8869{
8870 EVENT("(GLsync sync = 0x%0.8p)", sync);
8871
8872 try
8873 {
8874 gl::Context *context = gl::getNonLostContext();
8875
8876 if (context)
8877 {
8878 if (context->getClientVersion() < 3)
8879 {
8880 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008882
Jamie Madill5215e1a2013-07-26 11:55:19 -04008883 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885 }
8886 catch(std::bad_alloc&)
8887 {
8888 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8889 }
8890
8891 return GL_FALSE;
8892}
8893
8894void __stdcall glDeleteSync(GLsync sync)
8895{
8896 EVENT("(GLsync sync = 0x%0.8p)", sync);
8897
8898 try
8899 {
8900 gl::Context *context = gl::getNonLostContext();
8901
8902 if (context)
8903 {
8904 if (context->getClientVersion() < 3)
8905 {
8906 return gl::error(GL_INVALID_OPERATION);
8907 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008908
Jamie Madill5215e1a2013-07-26 11:55:19 -04008909 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8910 {
8911 return gl::error(GL_INVALID_VALUE);
8912 }
8913
8914 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008915 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008916 }
8917 catch(std::bad_alloc&)
8918 {
8919 return gl::error(GL_OUT_OF_MEMORY);
8920 }
8921}
8922
8923GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8924{
8925 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8926 sync, flags, timeout);
8927
8928 try
8929 {
8930 gl::Context *context = gl::getNonLostContext();
8931
8932 if (context)
8933 {
8934 if (context->getClientVersion() < 3)
8935 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008936 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008937 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008938
Jamie Madill5215e1a2013-07-26 11:55:19 -04008939 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8940 {
8941 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8942 }
8943
8944 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8945
8946 if (!fenceSync)
8947 {
8948 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8949 }
8950
8951 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008952 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008953 }
8954 catch(std::bad_alloc&)
8955 {
8956 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8957 }
8958
8959 return GL_FALSE;
8960}
8961
8962void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8963{
8964 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8965 sync, flags, timeout);
8966
8967 try
8968 {
8969 gl::Context *context = gl::getNonLostContext();
8970
8971 if (context)
8972 {
8973 if (context->getClientVersion() < 3)
8974 {
8975 return gl::error(GL_INVALID_OPERATION);
8976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008977
Jamie Madill5215e1a2013-07-26 11:55:19 -04008978 if (flags != 0)
8979 {
8980 return gl::error(GL_INVALID_VALUE);
8981 }
8982
8983 if (timeout != GL_TIMEOUT_IGNORED)
8984 {
8985 return gl::error(GL_INVALID_VALUE);
8986 }
8987
8988 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8989
8990 if (!fenceSync)
8991 {
8992 return gl::error(GL_INVALID_VALUE);
8993 }
8994
8995 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008997 }
8998 catch(std::bad_alloc&)
8999 {
9000 return gl::error(GL_OUT_OF_MEMORY);
9001 }
9002}
9003
9004void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9005{
9006 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9007 pname, params);
9008
9009 try
9010 {
9011 gl::Context *context = gl::getNonLostContext();
9012
9013 if (context)
9014 {
9015 if (context->getClientVersion() < 3)
9016 {
9017 return gl::error(GL_INVALID_OPERATION);
9018 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009019
Jamie Madill79f2f452013-12-19 11:13:02 -05009020 GLenum nativeType;
9021 unsigned int numParams = 0;
9022 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9023 return gl::error(GL_INVALID_ENUM);
9024
9025 // pname is valid, but that there are no parameters to return.
9026 if (numParams == 0)
9027 return;
9028
9029 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009030 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009031 context->getInteger64v(pname, params);
9032 }
Jamie Madill55856b12014-01-02 13:59:50 -05009033 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009034 {
Jamie Madill55856b12014-01-02 13:59:50 -05009035 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009036 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009038 }
9039 catch(std::bad_alloc&)
9040 {
9041 return gl::error(GL_OUT_OF_MEMORY);
9042 }
9043}
9044
9045void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9046{
9047 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9048 sync, pname, bufSize, length, values);
9049
9050 try
9051 {
9052 gl::Context *context = gl::getNonLostContext();
9053
9054 if (context)
9055 {
9056 if (context->getClientVersion() < 3)
9057 {
9058 return gl::error(GL_INVALID_OPERATION);
9059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060
Jamie Madill5215e1a2013-07-26 11:55:19 -04009061 if (bufSize < 0)
9062 {
9063 return gl::error(GL_INVALID_VALUE);
9064 }
9065
9066 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9067
9068 if (!fenceSync)
9069 {
9070 return gl::error(GL_INVALID_VALUE);
9071 }
9072
9073 switch (pname)
9074 {
9075 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9076 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9077 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9078 case GL_SYNC_FLAGS: values[0] = 0; break;
9079
9080 default:
9081 return gl::error(GL_INVALID_ENUM);
9082 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009084 }
9085 catch(std::bad_alloc&)
9086 {
9087 return gl::error(GL_OUT_OF_MEMORY);
9088 }
9089}
9090
9091void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9092{
9093 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9094 target, index, data);
9095
9096 try
9097 {
9098 gl::Context *context = gl::getNonLostContext();
9099
9100 if (context)
9101 {
9102 if (context->getClientVersion() < 3)
9103 {
9104 return gl::error(GL_INVALID_OPERATION);
9105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009106
Shannon Woods15934d52013-08-19 14:28:49 -04009107 switch (target)
9108 {
9109 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9110 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9111 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9112 if (index >= context->getMaxTransformFeedbackBufferBindings())
9113 return gl::error(GL_INVALID_VALUE);
9114 break;
9115 case GL_UNIFORM_BUFFER_START:
9116 case GL_UNIFORM_BUFFER_SIZE:
9117 case GL_UNIFORM_BUFFER_BINDING:
9118 if (index >= context->getMaximumCombinedUniformBufferBindings())
9119 return gl::error(GL_INVALID_VALUE);
9120 break;
9121 default:
9122 return gl::error(GL_INVALID_ENUM);
9123 }
9124
9125 if (!(context->getIndexedInteger64v(target, index, data)))
9126 {
9127 GLenum nativeType;
9128 unsigned int numParams = 0;
9129 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9130 return gl::error(GL_INVALID_ENUM);
9131
9132 if (numParams == 0)
9133 return; // it is known that pname is valid, but there are no parameters to return
9134
9135 if (nativeType == GL_INT)
9136 {
9137 GLint *intParams = new GLint[numParams];
9138
9139 context->getIndexedIntegerv(target, index, intParams);
9140
9141 for (unsigned int i = 0; i < numParams; ++i)
9142 {
9143 data[i] = static_cast<GLint64>(intParams[i]);
9144 }
9145
9146 delete [] intParams;
9147 }
9148 else
9149 {
9150 UNREACHABLE();
9151 }
9152 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009153 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009154 }
9155 catch(std::bad_alloc&)
9156 {
9157 return gl::error(GL_OUT_OF_MEMORY);
9158 }
9159}
9160
9161void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9162{
9163 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9164 target, pname, params);
9165
9166 try
9167 {
9168 gl::Context *context = gl::getNonLostContext();
9169
9170 if (context)
9171 {
9172 if (context->getClientVersion() < 3)
9173 {
9174 return gl::error(GL_INVALID_OPERATION);
9175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009176
Jamie Madill54133512013-06-21 09:33:07 -04009177 // glGetBufferParameteri64v
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009178 UNIMPLEMENTED();
9179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009180 }
9181 catch(std::bad_alloc&)
9182 {
9183 return gl::error(GL_OUT_OF_MEMORY);
9184 }
9185}
9186
9187void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9188{
9189 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9190
9191 try
9192 {
9193 gl::Context *context = gl::getNonLostContext();
9194
9195 if (context)
9196 {
9197 if (context->getClientVersion() < 3)
9198 {
9199 return gl::error(GL_INVALID_OPERATION);
9200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009201
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009202 if (count < 0)
9203 {
9204 return gl::error(GL_INVALID_VALUE);
9205 }
9206
9207 for (int i = 0; i < count; i++)
9208 {
9209 samplers[i] = context->createSampler();
9210 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009211 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009212 }
9213 catch(std::bad_alloc&)
9214 {
9215 return gl::error(GL_OUT_OF_MEMORY);
9216 }
9217}
9218
9219void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9220{
9221 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9222
9223 try
9224 {
9225 gl::Context *context = gl::getNonLostContext();
9226
9227 if (context)
9228 {
9229 if (context->getClientVersion() < 3)
9230 {
9231 return gl::error(GL_INVALID_OPERATION);
9232 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009233
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009234 if (count < 0)
9235 {
9236 return gl::error(GL_INVALID_VALUE);
9237 }
9238
9239 for (int i = 0; i < count; i++)
9240 {
9241 context->deleteSampler(samplers[i]);
9242 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009244 }
9245 catch(std::bad_alloc&)
9246 {
9247 return gl::error(GL_OUT_OF_MEMORY);
9248 }
9249}
9250
9251GLboolean __stdcall glIsSampler(GLuint sampler)
9252{
9253 EVENT("(GLuint sampler = %u)", sampler);
9254
9255 try
9256 {
9257 gl::Context *context = gl::getNonLostContext();
9258
9259 if (context)
9260 {
9261 if (context->getClientVersion() < 3)
9262 {
9263 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009265
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009266 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009268 }
9269 catch(std::bad_alloc&)
9270 {
9271 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9272 }
9273
9274 return GL_FALSE;
9275}
9276
9277void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9278{
9279 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9280
9281 try
9282 {
9283 gl::Context *context = gl::getNonLostContext();
9284
9285 if (context)
9286 {
9287 if (context->getClientVersion() < 3)
9288 {
9289 return gl::error(GL_INVALID_OPERATION);
9290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009291
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009292 if (sampler != 0 && !context->isSampler(sampler))
9293 {
9294 return gl::error(GL_INVALID_OPERATION);
9295 }
9296
9297 if (unit >= context->getMaximumCombinedTextureImageUnits())
9298 {
9299 return gl::error(GL_INVALID_VALUE);
9300 }
9301
9302 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009304 }
9305 catch(std::bad_alloc&)
9306 {
9307 return gl::error(GL_OUT_OF_MEMORY);
9308 }
9309}
9310
9311void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9312{
9313 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9314
9315 try
9316 {
9317 gl::Context *context = gl::getNonLostContext();
9318
9319 if (context)
9320 {
9321 if (context->getClientVersion() < 3)
9322 {
9323 return gl::error(GL_INVALID_OPERATION);
9324 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009325
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009326 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009327 {
9328 return;
9329 }
9330
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009331 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009332 {
9333 return;
9334 }
9335
9336 if (!context->isSampler(sampler))
9337 {
9338 return gl::error(GL_INVALID_OPERATION);
9339 }
9340
9341 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009342 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009343 }
9344 catch(std::bad_alloc&)
9345 {
9346 return gl::error(GL_OUT_OF_MEMORY);
9347 }
9348}
9349
9350void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9351{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009352 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009353}
9354
9355void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9356{
9357 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9358
9359 try
9360 {
9361 gl::Context *context = gl::getNonLostContext();
9362
9363 if (context)
9364 {
9365 if (context->getClientVersion() < 3)
9366 {
9367 return gl::error(GL_INVALID_OPERATION);
9368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009369
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009370 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009371 {
9372 return;
9373 }
9374
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009375 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009376 {
9377 return;
9378 }
9379
9380 if (!context->isSampler(sampler))
9381 {
9382 return gl::error(GL_INVALID_OPERATION);
9383 }
9384
9385 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009386 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009387 }
9388 catch(std::bad_alloc&)
9389 {
9390 return gl::error(GL_OUT_OF_MEMORY);
9391 }
9392}
9393
9394void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9395{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009396 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009397}
9398
9399void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9400{
9401 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9402
9403 try
9404 {
9405 gl::Context *context = gl::getNonLostContext();
9406
9407 if (context)
9408 {
9409 if (context->getClientVersion() < 3)
9410 {
9411 return gl::error(GL_INVALID_OPERATION);
9412 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009413
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009414 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009415 {
9416 return;
9417 }
9418
9419 if (!context->isSampler(sampler))
9420 {
9421 return gl::error(GL_INVALID_OPERATION);
9422 }
9423
9424 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009425 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009426 }
9427 catch(std::bad_alloc&)
9428 {
9429 return gl::error(GL_OUT_OF_MEMORY);
9430 }
9431}
9432
9433void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9434{
9435 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9436
9437 try
9438 {
9439 gl::Context *context = gl::getNonLostContext();
9440
9441 if (context)
9442 {
9443 if (context->getClientVersion() < 3)
9444 {
9445 return gl::error(GL_INVALID_OPERATION);
9446 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009447
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009448 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009449 {
9450 return;
9451 }
9452
9453 if (!context->isSampler(sampler))
9454 {
9455 return gl::error(GL_INVALID_OPERATION);
9456 }
9457
9458 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009459 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009460 }
9461 catch(std::bad_alloc&)
9462 {
9463 return gl::error(GL_OUT_OF_MEMORY);
9464 }
9465}
9466
9467void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9468{
9469 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9470
9471 try
9472 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009473 if (index >= gl::MAX_VERTEX_ATTRIBS)
9474 {
9475 return gl::error(GL_INVALID_VALUE);
9476 }
9477
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009478 gl::Context *context = gl::getNonLostContext();
9479
9480 if (context)
9481 {
9482 if (context->getClientVersion() < 3)
9483 {
9484 return gl::error(GL_INVALID_OPERATION);
9485 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009486
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009487 context->setVertexAttribDivisor(index, divisor);
9488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009489 }
9490 catch(std::bad_alloc&)
9491 {
9492 return gl::error(GL_OUT_OF_MEMORY);
9493 }
9494}
9495
9496void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9497{
9498 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9499
9500 try
9501 {
9502 gl::Context *context = gl::getNonLostContext();
9503
9504 if (context)
9505 {
9506 if (context->getClientVersion() < 3)
9507 {
9508 return gl::error(GL_INVALID_OPERATION);
9509 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009510
Jamie Madill54133512013-06-21 09:33:07 -04009511 // glBindTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009512 UNIMPLEMENTED();
9513 }
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 glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9522{
9523 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9524
9525 try
9526 {
9527 gl::Context *context = gl::getNonLostContext();
9528
9529 if (context)
9530 {
9531 if (context->getClientVersion() < 3)
9532 {
9533 return gl::error(GL_INVALID_OPERATION);
9534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009535
Jamie Madill54133512013-06-21 09:33:07 -04009536 // glDeleteTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009537 UNIMPLEMENTED();
9538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009539 }
9540 catch(std::bad_alloc&)
9541 {
9542 return gl::error(GL_OUT_OF_MEMORY);
9543 }
9544}
9545
9546void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9547{
9548 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9549
9550 try
9551 {
9552 gl::Context *context = gl::getNonLostContext();
9553
9554 if (context)
9555 {
9556 if (context->getClientVersion() < 3)
9557 {
9558 return gl::error(GL_INVALID_OPERATION);
9559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009560
Jamie Madill54133512013-06-21 09:33:07 -04009561 // glGenTransformFeedbacks
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009562 UNIMPLEMENTED();
9563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009564 }
9565 catch(std::bad_alloc&)
9566 {
9567 return gl::error(GL_OUT_OF_MEMORY);
9568 }
9569}
9570
9571GLboolean __stdcall glIsTransformFeedback(GLuint id)
9572{
9573 EVENT("(GLuint id = %u)", id);
9574
9575 try
9576 {
9577 gl::Context *context = gl::getNonLostContext();
9578
9579 if (context)
9580 {
9581 if (context->getClientVersion() < 3)
9582 {
9583 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009585
Jamie Madill54133512013-06-21 09:33:07 -04009586 // glIsTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009587 UNIMPLEMENTED();
9588 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009589 }
9590 catch(std::bad_alloc&)
9591 {
9592 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9593 }
9594
9595 return GL_FALSE;
9596}
9597
9598void __stdcall glPauseTransformFeedback(void)
9599{
9600 EVENT("(void)");
9601
9602 try
9603 {
9604 gl::Context *context = gl::getNonLostContext();
9605
9606 if (context)
9607 {
9608 if (context->getClientVersion() < 3)
9609 {
9610 return gl::error(GL_INVALID_OPERATION);
9611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009612
Jamie Madill54133512013-06-21 09:33:07 -04009613 // glPauseTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009614 UNIMPLEMENTED();
9615 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009616 }
9617 catch(std::bad_alloc&)
9618 {
9619 return gl::error(GL_OUT_OF_MEMORY);
9620 }
9621}
9622
9623void __stdcall glResumeTransformFeedback(void)
9624{
9625 EVENT("(void)");
9626
9627 try
9628 {
9629 gl::Context *context = gl::getNonLostContext();
9630
9631 if (context)
9632 {
9633 if (context->getClientVersion() < 3)
9634 {
9635 return gl::error(GL_INVALID_OPERATION);
9636 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009637
Jamie Madill54133512013-06-21 09:33:07 -04009638 // glResumeTransformFeedback
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009639 UNIMPLEMENTED();
9640 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009641 }
9642 catch(std::bad_alloc&)
9643 {
9644 return gl::error(GL_OUT_OF_MEMORY);
9645 }
9646}
9647
9648void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9649{
9650 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9651 program, bufSize, length, binaryFormat, binary);
9652
9653 try
9654 {
9655 gl::Context *context = gl::getNonLostContext();
9656
9657 if (context)
9658 {
9659 if (context->getClientVersion() < 3)
9660 {
9661 return gl::error(GL_INVALID_OPERATION);
9662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009663
Jamie Madill54133512013-06-21 09:33:07 -04009664 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009665 UNIMPLEMENTED();
9666 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009667 }
9668 catch(std::bad_alloc&)
9669 {
9670 return gl::error(GL_OUT_OF_MEMORY);
9671 }
9672}
9673
9674void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9675{
9676 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9677 program, binaryFormat, binary, length);
9678
9679 try
9680 {
9681 gl::Context *context = gl::getNonLostContext();
9682
9683 if (context)
9684 {
9685 if (context->getClientVersion() < 3)
9686 {
9687 return gl::error(GL_INVALID_OPERATION);
9688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009689
Jamie Madill54133512013-06-21 09:33:07 -04009690 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009691 UNIMPLEMENTED();
9692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009693 }
9694 catch(std::bad_alloc&)
9695 {
9696 return gl::error(GL_OUT_OF_MEMORY);
9697 }
9698}
9699
9700void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9701{
9702 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9703 program, pname, value);
9704
9705 try
9706 {
9707 gl::Context *context = gl::getNonLostContext();
9708
9709 if (context)
9710 {
9711 if (context->getClientVersion() < 3)
9712 {
9713 return gl::error(GL_INVALID_OPERATION);
9714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009715
Jamie Madill54133512013-06-21 09:33:07 -04009716 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009717 UNIMPLEMENTED();
9718 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009719 }
9720 catch(std::bad_alloc&)
9721 {
9722 return gl::error(GL_OUT_OF_MEMORY);
9723 }
9724}
9725
9726void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9727{
9728 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9729 target, numAttachments, attachments);
9730
9731 try
9732 {
9733 gl::Context *context = gl::getNonLostContext();
9734
9735 if (context)
9736 {
9737 if (context->getClientVersion() < 3)
9738 {
9739 return gl::error(GL_INVALID_OPERATION);
9740 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009741
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009742 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009743 {
9744 return;
9745 }
9746
9747 int maxDimension = context->getMaximumRenderbufferDimension();
9748 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9749 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009750 }
9751 catch(std::bad_alloc&)
9752 {
9753 return gl::error(GL_OUT_OF_MEMORY);
9754 }
9755}
9756
9757void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9758{
9759 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9760 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9761 target, numAttachments, attachments, x, y, width, height);
9762
9763 try
9764 {
9765 gl::Context *context = gl::getNonLostContext();
9766
9767 if (context)
9768 {
9769 if (context->getClientVersion() < 3)
9770 {
9771 return gl::error(GL_INVALID_OPERATION);
9772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009773
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009774 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009775 {
9776 return;
9777 }
9778
9779 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009781 }
9782 catch(std::bad_alloc&)
9783 {
9784 return gl::error(GL_OUT_OF_MEMORY);
9785 }
9786}
9787
9788void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9789{
9790 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9791 target, levels, internalformat, width, height);
9792
9793 try
9794 {
9795 gl::Context *context = gl::getNonLostContext();
9796
9797 if (context)
9798 {
9799 if (context->getClientVersion() < 3)
9800 {
9801 return gl::error(GL_INVALID_OPERATION);
9802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009803
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009804 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009805 {
9806 return;
9807 }
9808
9809 switch (target)
9810 {
9811 case GL_TEXTURE_2D:
9812 {
9813 gl::Texture2D *texture2d = context->getTexture2D();
9814 texture2d->storage(levels, internalformat, width, height);
9815 }
9816 break;
9817
Geoff Lang01c21d22013-09-24 11:52:16 -04009818 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009819 {
9820 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9821 textureCube->storage(levels, internalformat, width);
9822 }
9823 break;
9824
9825 default:
9826 return gl::error(GL_INVALID_ENUM);
9827 }
9828 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009829 }
9830 catch(std::bad_alloc&)
9831 {
9832 return gl::error(GL_OUT_OF_MEMORY);
9833 }
9834}
9835
9836void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9837{
9838 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9839 "GLsizei height = %d, GLsizei depth = %d)",
9840 target, levels, internalformat, width, height, depth);
9841
9842 try
9843 {
9844 gl::Context *context = gl::getNonLostContext();
9845
9846 if (context)
9847 {
9848 if (context->getClientVersion() < 3)
9849 {
9850 return gl::error(GL_INVALID_OPERATION);
9851 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009852
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009853 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009854 {
9855 return;
9856 }
9857
9858 switch (target)
9859 {
9860 case GL_TEXTURE_3D:
9861 {
9862 gl::Texture3D *texture3d = context->getTexture3D();
9863 texture3d->storage(levels, internalformat, width, height, depth);
9864 }
9865 break;
9866
9867 case GL_TEXTURE_2D_ARRAY:
9868 {
9869 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9870 texture2darray->storage(levels, internalformat, width, height, depth);
9871 }
9872 break;
9873
9874 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009875 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009876 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009877 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009878 }
9879 catch(std::bad_alloc&)
9880 {
9881 return gl::error(GL_OUT_OF_MEMORY);
9882 }
9883}
9884
9885void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9886{
9887 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9888 "GLint* params = 0x%0.8p)",
9889 target, internalformat, pname, bufSize, params);
9890
9891 try
9892 {
9893 gl::Context *context = gl::getNonLostContext();
9894
9895 if (context)
9896 {
9897 if (context->getClientVersion() < 3)
9898 {
9899 return gl::error(GL_INVALID_OPERATION);
9900 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009901
Shannon Woods809d2502013-07-08 10:32:18 -04009902 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9903 !gl::IsDepthRenderingSupported(internalformat, context) &&
9904 !gl::IsStencilRenderingSupported(internalformat, context))
9905 {
9906 return gl::error(GL_INVALID_ENUM);
9907 }
9908
9909 if (target != GL_RENDERBUFFER)
9910 {
9911 return gl::error(GL_INVALID_ENUM);
9912 }
9913
9914 if (bufSize < 0)
9915 {
9916 return gl::error(GL_INVALID_VALUE);
9917 }
9918
9919 switch (pname)
9920 {
9921 case GL_NUM_SAMPLE_COUNTS:
9922 if (bufSize != 0)
9923 *params = context->getNumSampleCounts(internalformat);
9924 break;
9925 case GL_SAMPLES:
9926 context->getSampleCounts(internalformat, bufSize, params);
9927 break;
9928 default:
9929 return gl::error(GL_INVALID_ENUM);
9930 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009931 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009932 }
9933 catch(std::bad_alloc&)
9934 {
9935 return gl::error(GL_OUT_OF_MEMORY);
9936 }
9937}
9938
9939// Extension functions
9940
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009941void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9942 GLbitfield mask, GLenum filter)
9943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009944 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009945 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9946 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9947 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9948
9949 try
9950 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009951 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009952
9953 if (context)
9954 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009955 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009956 dstX0, dstY0, dstX1, dstY1, mask, filter,
9957 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009958 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009959 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009960 }
9961
Geoff Lang758d5b22013-06-11 11:42:50 -04009962 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9963 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009964 }
9965 }
9966 catch(std::bad_alloc&)
9967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009968 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009969 }
9970}
9971
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009972void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9973 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009975 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009976 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009977 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009978 target, level, internalformat, width, height, depth, border, format, type, pixels);
9979
9980 try
9981 {
9982 UNIMPLEMENTED(); // FIXME
9983 }
9984 catch(std::bad_alloc&)
9985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009987 }
9988}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009989
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009990void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9991 GLenum *binaryFormat, void *binary)
9992{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009993 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 +00009994 program, bufSize, length, binaryFormat, binary);
9995
9996 try
9997 {
9998 gl::Context *context = gl::getNonLostContext();
9999
10000 if (context)
10001 {
10002 gl::Program *programObject = context->getProgram(program);
10003
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010004 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010006 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010007 }
10008
10009 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10010
10011 if (!programBinary)
10012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010013 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010014 }
10015
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010016 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010018 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010019 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010020
10021 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010022 }
10023 }
10024 catch(std::bad_alloc&)
10025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010026 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010027 }
10028}
10029
10030void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10031 const void *binary, GLint length)
10032{
10033 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10034 program, binaryFormat, binary, length);
10035
10036 try
10037 {
10038 gl::Context *context = gl::getNonLostContext();
10039
10040 if (context)
10041 {
10042 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010044 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010045 }
10046
10047 gl::Program *programObject = context->getProgram(program);
10048
10049 if (!programObject)
10050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010051 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010052 }
10053
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010054 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010055 }
10056 }
10057 catch(std::bad_alloc&)
10058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010059 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010060 }
10061}
10062
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010063void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10064{
10065 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10066
10067 try
10068 {
10069 gl::Context *context = gl::getNonLostContext();
10070
10071 if (context)
10072 {
10073 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10074 {
10075 return gl::error(GL_INVALID_VALUE);
10076 }
10077
10078 if (context->getDrawFramebufferHandle() == 0)
10079 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010080 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010081 {
10082 return gl::error(GL_INVALID_OPERATION);
10083 }
10084
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010085 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010086 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010087 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010088 }
10089 }
10090 else
10091 {
10092 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10093 {
10094 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10095 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10096 {
10097 return gl::error(GL_INVALID_OPERATION);
10098 }
10099 }
10100 }
10101
10102 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10103
10104 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10105 {
10106 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10107 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010108
10109 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10110 {
10111 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10112 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010113 }
10114 }
10115 catch (std::bad_alloc&)
10116 {
10117 return gl::error(GL_OUT_OF_MEMORY);
10118 }
10119}
10120
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010121__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10122{
10123 struct Extension
10124 {
10125 const char *name;
10126 __eglMustCastToProperFunctionPointerType address;
10127 };
10128
10129 static const Extension glExtensions[] =
10130 {
10131 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010132 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010133 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010134 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10135 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10136 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10137 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10138 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10139 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10140 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010141 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010142 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010143 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10144 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10145 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10146 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010147 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10148 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10149 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10150 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10151 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10152 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10153 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010154 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010155 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10156 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10157 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010158 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10159 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010160
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010161 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010162 {
10163 if (strcmp(procname, glExtensions[ext].name) == 0)
10164 {
10165 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10166 }
10167 }
10168
10169 return NULL;
10170}
10171
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010172// Non-public functions used by EGL
10173
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010174bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010175{
10176 EVENT("(egl::Surface* surface = 0x%0.8p)",
10177 surface);
10178
10179 try
10180 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010181 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010182
10183 if (context)
10184 {
10185 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010186 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010187
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010188 if (textureObject->isImmutable())
10189 {
10190 return false;
10191 }
10192
Geoff Lang32d508e2014-02-11 09:39:48 -050010193 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010194 }
10195 }
10196 catch(std::bad_alloc&)
10197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010198 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010199 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010200
10201 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010202}
10203
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010204}