blob: 6be355aeb07928fef61dd0196dac574c0f50d07b [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Brandon Jones5bf98292014-06-06 17:19:38 -070025#include "libGLESv2/VertexAttribute.h"
Geoff Langc8058452014-02-03 12:04:11 -050026#include "libGLESv2/TransformFeedback.h"
Jamie Madille261b442014-06-25 12:42:21 -040027#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028
Geoff Lange8ebe7f2013-08-05 15:03:13 -040029#include "libGLESv2/validationES.h"
30#include "libGLESv2/validationES2.h"
31#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050032#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040033
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034extern "C"
35{
36
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000037// OpenGL ES 2.0 functions
38
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039void __stdcall glActiveTexture(GLenum texture)
40{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000041 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000042
43 try
44 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000045 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000046
47 if (context)
48 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000049 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
50 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000051 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000052 }
53
daniel@transgaming.com428d1582010-05-04 03:35:25 +000054 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055 }
56 }
Jamie Madillde0ec752014-05-05 15:10:38 -040057 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000059 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060 }
61}
62
63void __stdcall glAttachShader(GLuint program, GLuint shader)
64{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000065 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066
67 try
68 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000069 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070
71 if (context)
72 {
73 gl::Program *programObject = context->getProgram(program);
74 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000075
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000078 if (context->getShader(program))
79 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000081 }
82 else
83 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000084 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000085 }
86 }
87
88 if (!shaderObject)
89 {
90 if (context->getProgram(shader))
91 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000092 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000093 }
94 else
95 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000096 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000098 }
99
100 if (!programObject->attachShader(shaderObject))
101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000102 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000103 }
104 }
105 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400106 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000108 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109 }
110}
111
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000112void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
113{
114 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
115
116 try
117 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000118 gl::Context *context = gl::getNonLostContext();
119
120 if (context)
121 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400122 if (!ValidateBeginQuery(context, target, id))
Geoff Lang37dde692014-01-31 16:34:54 -0500123 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400124 return;
Geoff Lang37dde692014-01-31 16:34:54 -0500125 }
126
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000127 context->beginQuery(target, id);
128 }
129 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400130 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000132 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000133 }
134}
135
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000136void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000138 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000139
140 try
141 {
142 if (index >= gl::MAX_VERTEX_ATTRIBS)
143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000144 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145 }
146
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148
149 if (context)
150 {
151 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000152
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000153 if (!programObject)
154 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000155 if (context->getShader(program))
156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000157 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000158 }
159 else
160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000161 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000162 }
163 }
164
165 if (strncmp(name, "gl_", 3) == 0)
166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000167 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168 }
169
170 programObject->bindAttributeLocation(index, name);
171 }
172 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400173 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000175 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000176 }
177}
178
179void __stdcall glBindBuffer(GLenum target, GLuint buffer)
180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000181 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000182
183 try
184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000186
187 if (context)
188 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500189 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000190 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500191 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000192 }
193
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194 switch (target)
195 {
196 case GL_ARRAY_BUFFER:
197 context->bindArrayBuffer(buffer);
198 return;
199 case GL_ELEMENT_ARRAY_BUFFER:
200 context->bindElementArrayBuffer(buffer);
201 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000202 case GL_COPY_READ_BUFFER:
203 context->bindCopyReadBuffer(buffer);
204 return;
205 case GL_COPY_WRITE_BUFFER:
206 context->bindCopyWriteBuffer(buffer);
207 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000208 case GL_PIXEL_PACK_BUFFER:
209 context->bindPixelPackBuffer(buffer);
210 return;
211 case GL_PIXEL_UNPACK_BUFFER:
212 context->bindPixelUnpackBuffer(buffer);
213 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000214 case GL_UNIFORM_BUFFER:
215 context->bindGenericUniformBuffer(buffer);
216 return;
217 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000218 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000219 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000221 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222 }
223 }
224 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400225 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000227 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228 }
229}
230
231void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000233 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234
235 try
236 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500237 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240 }
241
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000242 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243
244 if (context)
245 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000246 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
247 {
248 context->bindReadFramebuffer(framebuffer);
249 }
250
251 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
252 {
253 context->bindDrawFramebuffer(framebuffer);
254 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255 }
256 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400257 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260 }
261}
262
263void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000265 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266
267 try
268 {
269 if (target != GL_RENDERBUFFER)
270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000272 }
273
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275
276 if (context)
277 {
278 context->bindRenderbuffer(renderbuffer);
279 }
280 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400281 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000283 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000284 }
285}
286
287void __stdcall glBindTexture(GLenum target, GLuint texture)
288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000289 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000290
291 try
292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000294
295 if (context)
296 {
297 gl::Texture *textureObject = context->getTexture(texture);
298
299 if (textureObject && textureObject->getTarget() != target && texture != 0)
300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000301 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000302 }
303
304 switch (target)
305 {
306 case GL_TEXTURE_2D:
307 context->bindTexture2D(texture);
308 return;
309 case GL_TEXTURE_CUBE_MAP:
310 context->bindTextureCubeMap(texture);
311 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000312 case GL_TEXTURE_3D:
313 if (context->getClientVersion() < 3)
314 {
315 return gl::error(GL_INVALID_ENUM);
316 }
317 context->bindTexture3D(texture);
318 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000319 case GL_TEXTURE_2D_ARRAY:
320 if (context->getClientVersion() < 3)
321 {
322 return gl::error(GL_INVALID_ENUM);
323 }
324 context->bindTexture2DArray(texture);
325 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000327 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000328 }
329 }
330 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400331 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334 }
335}
336
337void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000339 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000340 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341
342 try
343 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000344 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000345
346 if (context)
347 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000348 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000349 }
350 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400351 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000353 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000354 }
355}
356
357void __stdcall glBlendEquation(GLenum mode)
358{
359 glBlendEquationSeparate(mode, mode);
360}
361
362void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000364 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000365
366 try
367 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000368 gl::Context *context = gl::getNonLostContext();
369
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370 switch (modeRGB)
371 {
372 case GL_FUNC_ADD:
373 case GL_FUNC_SUBTRACT:
374 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000375 case GL_MIN:
376 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000377 break;
378
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000380 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000381 }
382
383 switch (modeAlpha)
384 {
385 case GL_FUNC_ADD:
386 case GL_FUNC_SUBTRACT:
387 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388 case GL_MIN:
389 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000390 break;
391
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000393 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394 }
395
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000396 if (context)
397 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000398 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000399 }
400 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400401 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000403 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000404 }
405}
406
407void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
408{
409 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
410}
411
412void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000414 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 +0000415 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000416
417 try
418 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000419 gl::Context *context = gl::getNonLostContext();
420
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000421 switch (srcRGB)
422 {
423 case GL_ZERO:
424 case GL_ONE:
425 case GL_SRC_COLOR:
426 case GL_ONE_MINUS_SRC_COLOR:
427 case GL_DST_COLOR:
428 case GL_ONE_MINUS_DST_COLOR:
429 case GL_SRC_ALPHA:
430 case GL_ONE_MINUS_SRC_ALPHA:
431 case GL_DST_ALPHA:
432 case GL_ONE_MINUS_DST_ALPHA:
433 case GL_CONSTANT_COLOR:
434 case GL_ONE_MINUS_CONSTANT_COLOR:
435 case GL_CONSTANT_ALPHA:
436 case GL_ONE_MINUS_CONSTANT_ALPHA:
437 case GL_SRC_ALPHA_SATURATE:
438 break;
439 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000440 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441 }
442
443 switch (dstRGB)
444 {
445 case GL_ZERO:
446 case GL_ONE:
447 case GL_SRC_COLOR:
448 case GL_ONE_MINUS_SRC_COLOR:
449 case GL_DST_COLOR:
450 case GL_ONE_MINUS_DST_COLOR:
451 case GL_SRC_ALPHA:
452 case GL_ONE_MINUS_SRC_ALPHA:
453 case GL_DST_ALPHA:
454 case GL_ONE_MINUS_DST_ALPHA:
455 case GL_CONSTANT_COLOR:
456 case GL_ONE_MINUS_CONSTANT_COLOR:
457 case GL_CONSTANT_ALPHA:
458 case GL_ONE_MINUS_CONSTANT_ALPHA:
459 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000460
461 case GL_SRC_ALPHA_SATURATE:
462 if (!context || context->getClientVersion() < 3)
463 {
464 return gl::error(GL_INVALID_ENUM);
465 }
466 break;
467
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000469 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470 }
471
472 switch (srcAlpha)
473 {
474 case GL_ZERO:
475 case GL_ONE:
476 case GL_SRC_COLOR:
477 case GL_ONE_MINUS_SRC_COLOR:
478 case GL_DST_COLOR:
479 case GL_ONE_MINUS_DST_COLOR:
480 case GL_SRC_ALPHA:
481 case GL_ONE_MINUS_SRC_ALPHA:
482 case GL_DST_ALPHA:
483 case GL_ONE_MINUS_DST_ALPHA:
484 case GL_CONSTANT_COLOR:
485 case GL_ONE_MINUS_CONSTANT_COLOR:
486 case GL_CONSTANT_ALPHA:
487 case GL_ONE_MINUS_CONSTANT_ALPHA:
488 case GL_SRC_ALPHA_SATURATE:
489 break;
490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 }
493
494 switch (dstAlpha)
495 {
496 case GL_ZERO:
497 case GL_ONE:
498 case GL_SRC_COLOR:
499 case GL_ONE_MINUS_SRC_COLOR:
500 case GL_DST_COLOR:
501 case GL_ONE_MINUS_DST_COLOR:
502 case GL_SRC_ALPHA:
503 case GL_ONE_MINUS_SRC_ALPHA:
504 case GL_DST_ALPHA:
505 case GL_ONE_MINUS_DST_ALPHA:
506 case GL_CONSTANT_COLOR:
507 case GL_ONE_MINUS_CONSTANT_COLOR:
508 case GL_CONSTANT_ALPHA:
509 case GL_ONE_MINUS_CONSTANT_ALPHA:
510 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000511
512 case GL_SRC_ALPHA_SATURATE:
513 if (!context || context->getClientVersion() < 3)
514 {
515 return gl::error(GL_INVALID_ENUM);
516 }
517 break;
518
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000520 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000521 }
522
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000523 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
524 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
525
526 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
527 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
528
529 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000530 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000531 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 +0000532 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 }
534
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535 if (context)
536 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000537 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000538 }
539 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400540 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000543 }
544}
545
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000546void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000548 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 +0000549 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550
551 try
552 {
553 if (size < 0)
554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000555 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000556 }
557
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000558 gl::Context *context = gl::getNonLostContext();
559
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560 switch (usage)
561 {
562 case GL_STREAM_DRAW:
563 case GL_STATIC_DRAW:
564 case GL_DYNAMIC_DRAW:
565 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000566
567 case GL_STREAM_READ:
568 case GL_STREAM_COPY:
569 case GL_STATIC_READ:
570 case GL_STATIC_COPY:
571 case GL_DYNAMIC_READ:
572 case GL_DYNAMIC_COPY:
573 if (context && context->getClientVersion() < 3)
574 {
575 return gl::error(GL_INVALID_ENUM);
576 }
577 break;
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000580 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 }
582
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000583 if (context)
584 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500585 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000587 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 }
589
Jamie Madill8c96d582014-03-05 15:01:23 -0500590 gl::Buffer *buffer = context->getTargetBuffer(target);
591
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000592 if (!buffer)
593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595 }
596
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000597 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000598 }
599 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400600 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000603 }
604}
605
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000606void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000608 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 +0000609 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610
611 try
612 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000613 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000615 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000616 }
617
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000618 if (data == NULL)
619 {
620 return;
621 }
622
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000624
625 if (context)
626 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500627 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000630 }
631
Jamie Madill8c96d582014-03-05 15:01:23 -0500632 gl::Buffer *buffer = context->getTargetBuffer(target);
633
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000634 if (!buffer)
635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000636 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 }
638
Jamie Madill7a5f7382014-03-05 15:01:24 -0500639 if (buffer->mapped())
640 {
641 return gl::error(GL_INVALID_OPERATION);
642 }
643
Geoff Lang876dc722014-05-01 17:10:24 -0400644 // Check for possible overflow of size + offset
645 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
646 {
647 return gl::error(GL_OUT_OF_MEMORY);
648 }
649
650 if (size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000653 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000654
655 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400658 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661 }
662}
663
664GLenum __stdcall glCheckFramebufferStatus(GLenum target)
665{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000666 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000667
668 try
669 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500670 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000672 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673 }
674
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000675 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000676
677 if (context)
678 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500679 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
680 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000681 return framebuffer->completeness();
682 }
683 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400684 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000686 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000687 }
688
689 return 0;
690}
691
692void __stdcall glClear(GLbitfield mask)
693{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000694 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000695
696 try
697 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000698 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699
700 if (context)
701 {
Geoff Lang0b833232013-08-21 10:13:29 -0400702 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
703
704 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
705 {
706 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
707 }
708
709 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
710 {
711 return gl::error(GL_INVALID_VALUE);
712 }
713
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000714 context->clear(mask);
715 }
716 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400717 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000720 }
721}
722
723void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000725 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000726 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000727
728 try
729 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000731
732 if (context)
733 {
734 context->setClearColor(red, green, blue, alpha);
735 }
736 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400737 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000740 }
741}
742
743void __stdcall glClearDepthf(GLclampf depth)
744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000745 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746
747 try
748 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000750
751 if (context)
752 {
753 context->setClearDepth(depth);
754 }
755 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400756 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000759 }
760}
761
762void __stdcall glClearStencil(GLint s)
763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000764 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000765
766 try
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 {
772 context->setClearStencil(s);
773 }
774 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400775 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000777 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778 }
779}
780
781void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
782{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000783 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000784 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000785
786 try
787 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000788 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 if (context)
791 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000792 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000793 }
794 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400795 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000798 }
799}
800
801void __stdcall glCompileShader(GLuint shader)
802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000803 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804
805 try
806 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000807 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808
809 if (context)
810 {
811 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000812
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 if (!shaderObject)
814 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000815 if (context->getProgram(shader))
816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000817 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000818 }
819 else
820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000822 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000823 }
824
825 shaderObject->compile();
826 }
827 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400828 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000830 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000831 }
832}
833
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000834void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
835 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000837 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000838 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000839 target, level, internalformat, width, height, border, imageSize, data);
840
841 try
842 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000843 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000844
845 if (context)
846 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000847 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400848 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400849 0, 0, width, height, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000850 {
851 return;
852 }
853
854 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400855 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madill6f38f822014-06-06 17:12:20 -0400856 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000857 {
858 return;
859 }
860
861 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000863 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000864 }
865
866 switch (target)
867 {
868 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000869 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000870 gl::Texture2D *texture = context->getTexture2D();
871 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000872 }
873 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000874
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000875 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
879 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
880 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000881 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000882 gl::TextureCubeMap *texture = context->getTextureCubeMap();
883 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000884 }
885 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000886
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000887 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000888 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000889 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000890 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400892 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000894 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000895 }
896}
897
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000898void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
899 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000901 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000902 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000903 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000904 target, level, xoffset, yoffset, width, height, format, imageSize, data);
905
906 try
907 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000908 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000909
910 if (context)
911 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000912 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400913 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000914 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
915 {
916 return;
917 }
918
919 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400920 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400921 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000922 {
923 return;
924 }
925
926 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000928 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000929 }
930
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000931 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000932 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000933 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000934 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000935 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000936 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000937 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000938 break;
939
940 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
941 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
942 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
943 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
944 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
945 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000946 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000947 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000948 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000949 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000950 break;
951
952 default:
953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000954 }
955 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400957 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960 }
961}
962
963void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000965 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000966 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 target, level, internalformat, x, y, width, height, border);
968
969 try
970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000972
973 if (context)
974 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400976 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000977 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000978 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000979 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000980 }
981
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000982 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400983 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000984 0, 0, 0, x, y, width, height, border))
985 {
986 return;
987 }
988
989 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
990
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000991 switch (target)
992 {
993 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000994 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000995 gl::Texture2D *texture = context->getTexture2D();
996 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000997 }
998 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000999
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001000 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1002 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1003 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1004 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1005 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001006 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001007 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1008 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001009 }
1010 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001011
1012 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001014 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001015 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001017 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001020 }
1021}
1022
1023void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1024{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001025 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001026 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001027 target, level, xoffset, yoffset, x, y, width, height);
1028
1029 try
1030 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001032
1033 if (context)
1034 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001036 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001037 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001038 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001039 return;
1040 }
1041
1042 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001043 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001044 xoffset, yoffset, 0, x, y, width, height, 0))
1045 {
1046 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001047 }
1048
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001049 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001050
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001051 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001052 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001053 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001054 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001055 gl::Texture2D *texture = context->getTexture2D();
1056 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001057 }
1058 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001059
1060 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1061 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1064 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1065 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001066 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001067 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1068 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001069 }
1070 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001072 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001074 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001075 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001076 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001077
Jamie Madillde0ec752014-05-05 15:10:38 -04001078 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001081 }
1082}
1083
1084GLuint __stdcall glCreateProgram(void)
1085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001086 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001087
1088 try
1089 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001091
1092 if (context)
1093 {
1094 return context->createProgram();
1095 }
1096 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001097 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001099 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001100 }
1101
1102 return 0;
1103}
1104
1105GLuint __stdcall glCreateShader(GLenum type)
1106{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001107 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001108
1109 try
1110 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001111 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001112
1113 if (context)
1114 {
1115 switch (type)
1116 {
1117 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001118 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 return context->createShader(type);
1120 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001121 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001122 }
1123 }
1124 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001125 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001127 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001128 }
1129
1130 return 0;
1131}
1132
1133void __stdcall glCullFace(GLenum mode)
1134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001135 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001136
1137 try
1138 {
1139 switch (mode)
1140 {
1141 case GL_FRONT:
1142 case GL_BACK:
1143 case GL_FRONT_AND_BACK:
1144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001146
1147 if (context)
1148 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001149 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001150 }
1151 }
1152 break;
1153 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001155 }
1156 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001157 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160 }
1161}
1162
1163void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001165 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166
1167 try
1168 {
1169 if (n < 0)
1170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172 }
1173
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175
1176 if (context)
1177 {
1178 for (int i = 0; i < n; i++)
1179 {
1180 context->deleteBuffer(buffers[i]);
1181 }
1182 }
1183 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001184 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001186 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001187 }
1188}
1189
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001190void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001192 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001193
1194 try
1195 {
1196 if (n < 0)
1197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001198 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001199 }
1200
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001201 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001202
1203 if (context)
1204 {
1205 for (int i = 0; i < n; i++)
1206 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001207 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001208 }
1209 }
1210 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001211 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001213 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001214 }
1215}
1216
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001219 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001220
1221 try
1222 {
1223 if (n < 0)
1224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001225 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001226 }
1227
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229
1230 if (context)
1231 {
1232 for (int i = 0; i < n; i++)
1233 {
1234 if (framebuffers[i] != 0)
1235 {
1236 context->deleteFramebuffer(framebuffers[i]);
1237 }
1238 }
1239 }
1240 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001241 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001244 }
1245}
1246
1247void __stdcall glDeleteProgram(GLuint program)
1248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001249 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250
1251 try
1252 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001253 if (program == 0)
1254 {
1255 return;
1256 }
1257
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001259
1260 if (context)
1261 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001262 if (!context->getProgram(program))
1263 {
1264 if(context->getShader(program))
1265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001266 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001267 }
1268 else
1269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001271 }
1272 }
1273
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 context->deleteProgram(program);
1275 }
1276 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001277 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 {
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
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001283void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1284{
1285 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1286
1287 try
1288 {
1289 if (n < 0)
1290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001291 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001292 }
1293
1294 gl::Context *context = gl::getNonLostContext();
1295
1296 if (context)
1297 {
1298 for (int i = 0; i < n; i++)
1299 {
1300 context->deleteQuery(ids[i]);
1301 }
1302 }
1303 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001304 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001307 }
1308}
1309
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001312 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
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 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001325 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001326 {
1327 context->deleteRenderbuffer(renderbuffers[i]);
1328 }
1329 }
1330 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001331 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001334 }
1335}
1336
1337void __stdcall glDeleteShader(GLuint shader)
1338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001339 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001340
1341 try
1342 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001343 if (shader == 0)
1344 {
1345 return;
1346 }
1347
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001348 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349
1350 if (context)
1351 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001352 if (!context->getShader(shader))
1353 {
1354 if(context->getProgram(shader))
1355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001356 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001357 }
1358 else
1359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001361 }
1362 }
1363
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001364 context->deleteShader(shader);
1365 }
1366 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001367 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370 }
1371}
1372
1373void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1374{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001375 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001376
1377 try
1378 {
1379 if (n < 0)
1380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001381 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382 }
1383
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385
1386 if (context)
1387 {
1388 for (int i = 0; i < n; i++)
1389 {
1390 if (textures[i] != 0)
1391 {
1392 context->deleteTexture(textures[i]);
1393 }
1394 }
1395 }
1396 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001397 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001399 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001400 }
1401}
1402
1403void __stdcall glDepthFunc(GLenum func)
1404{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001405 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001406
1407 try
1408 {
1409 switch (func)
1410 {
1411 case GL_NEVER:
1412 case GL_ALWAYS:
1413 case GL_LESS:
1414 case GL_LEQUAL:
1415 case GL_EQUAL:
1416 case GL_GREATER:
1417 case GL_GEQUAL:
1418 case GL_NOTEQUAL:
1419 break;
1420 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001421 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422 }
1423
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001425
1426 if (context)
1427 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001428 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001429 }
1430 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001431 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001434 }
1435}
1436
1437void __stdcall glDepthMask(GLboolean flag)
1438{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001439 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440
1441 try
1442 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001443 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001444
1445 if (context)
1446 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001447 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448 }
1449 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001450 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001453 }
1454}
1455
1456void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001458 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459
1460 try
1461 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463
1464 if (context)
1465 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001466 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467 }
1468 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001469 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001471 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001472 }
1473}
1474
1475void __stdcall glDetachShader(GLuint program, GLuint shader)
1476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001477 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478
1479 try
1480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482
1483 if (context)
1484 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001485
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001486 gl::Program *programObject = context->getProgram(program);
1487 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001488
1489 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001490 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001491 gl::Shader *shaderByProgramHandle;
1492 shaderByProgramHandle = context->getShader(program);
1493 if (!shaderByProgramHandle)
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001496 }
1497 else
1498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001500 }
1501 }
1502
1503 if (!shaderObject)
1504 {
1505 gl::Program *programByShaderHandle = context->getProgram(shader);
1506 if (!programByShaderHandle)
1507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001508 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001509 }
1510 else
1511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001513 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001514 }
1515
1516 if (!programObject->detachShader(shaderObject))
1517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001518 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001519 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001520 }
1521 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001522 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001525 }
1526}
1527
1528void __stdcall glDisable(GLenum cap)
1529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001530 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001531
1532 try
1533 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001534 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001535
1536 if (context)
1537 {
Geoff Lang0550d032014-01-30 11:29:07 -05001538 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001541 }
Geoff Lang0550d032014-01-30 11:29:07 -05001542
1543 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544 }
1545 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001546 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001549 }
1550}
1551
1552void __stdcall glDisableVertexAttribArray(GLuint index)
1553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001554 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001555
1556 try
1557 {
1558 if (index >= gl::MAX_VERTEX_ATTRIBS)
1559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001561 }
1562
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001563 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564
1565 if (context)
1566 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001567 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 }
1569 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001570 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573 }
1574}
1575
1576void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1577{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001578 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001579
1580 try
1581 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583
1584 if (context)
1585 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001586 if (!ValidateDrawArrays(context, mode, first, count))
Geoff Langeeba6e12014-02-03 13:12:30 -05001587 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001588 return;
Geoff Langeeba6e12014-02-03 13:12:30 -05001589 }
1590
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001591 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592 }
1593 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001594 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001597 }
1598}
1599
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001600void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1601{
1602 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1603
1604 try
1605 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001607
Jamie Madill250d33f2014-06-06 17:09:03 -04001608 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001609 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001610 if (!ValidateDrawArraysInstanced(context, mode, first, count, primcount))
Jamie Madill7a5f7382014-03-05 15:01:24 -05001611 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001612 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001613 }
1614
Jamie Madill250d33f2014-06-06 17:09:03 -04001615 context->drawArrays(mode, first, count, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001616 }
1617 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001618 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001621 }
1622}
1623
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001624void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001626 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 +00001627 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628
1629 try
1630 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001631 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632
1633 if (context)
1634 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001635 if (!ValidateDrawElements(context, mode, count, type, indices))
daniel@transgaming.com83921382011-01-08 05:46:00 +00001636 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001637 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001638 }
1639
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001640 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 }
1642 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001643 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646 }
1647}
1648
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001649void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1650{
1651 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1652 mode, count, type, indices, primcount);
1653
1654 try
1655 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001657
Jamie Madill250d33f2014-06-06 17:09:03 -04001658 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001659 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001660 if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, primcount))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001661 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001662 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001663 }
Jamie Madill250d33f2014-06-06 17:09:03 -04001664
1665 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001666 }
1667 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001668 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001671 }
1672}
1673
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001674void __stdcall glEnable(GLenum cap)
1675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001676 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001677
1678 try
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 {
Geoff Lang0550d032014-01-30 11:29:07 -05001684 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687 }
Geoff Lang0550d032014-01-30 11:29:07 -05001688
1689 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001690 }
1691 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001692 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001695 }
1696}
1697
1698void __stdcall glEnableVertexAttribArray(GLuint index)
1699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001700 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001701
1702 try
1703 {
1704 if (index >= gl::MAX_VERTEX_ATTRIBS)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707 }
1708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710
1711 if (context)
1712 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001713 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001714 }
1715 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001716 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001718 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719 }
1720}
1721
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001722void __stdcall glEndQueryEXT(GLenum target)
1723{
1724 EVENT("GLenum target = 0x%X)", target);
1725
1726 try
1727 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001728 gl::Context *context = gl::getNonLostContext();
1729
1730 if (context)
1731 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001732 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001733 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001734 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001735 }
1736
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001737 context->endQuery(target);
1738 }
1739 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001740 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001743 }
1744}
1745
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001746void __stdcall glFinishFenceNV(GLuint fence)
1747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001748 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001749
1750 try
1751 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001752 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001753
1754 if (context)
1755 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001756 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001757
1758 if (fenceObject == NULL)
1759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001760 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001761 }
1762
Jamie Madillfb9a7402013-07-26 11:55:01 -04001763 if (fenceObject->isFence() != GL_TRUE)
1764 {
1765 return gl::error(GL_INVALID_OPERATION);
1766 }
1767
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001768 fenceObject->finishFence();
1769 }
1770 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001771 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001773 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001774 }
1775}
1776
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001777void __stdcall glFinish(void)
1778{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001779 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780
1781 try
1782 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784
1785 if (context)
1786 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001787 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001790 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001793 }
1794}
1795
1796void __stdcall glFlush(void)
1797{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001798 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001799
1800 try
1801 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 if (context)
1805 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001806 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001807 }
1808 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001809 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813}
1814
1815void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1816{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001817 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001818 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819
1820 try
1821 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001822 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825 }
1826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001828
1829 if (context)
1830 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001831 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001832 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001833 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001834 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001835
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001836 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1837 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001839 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001840 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001841 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001842 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001843 }
1844 else
1845 {
1846 switch (attachment)
1847 {
1848 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001849 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001850 break;
1851 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001852 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001853 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001854 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001855 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1856 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001857 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001858 UNREACHABLE();
1859 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001860 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 }
1862 }
1863 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001864 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001867 }
1868}
1869
1870void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001872 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001873 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001874
1875 try
1876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878 if (context)
1879 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001880 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001881 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001882 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001883 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001884 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001885
1886 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001887 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001888 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001889 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001890 }
1891
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001892 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001894 textarget = GL_NONE;
1895 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001897 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001899 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001900 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001901 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001902 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001903 }
1904 else
1905 {
1906 switch (attachment)
1907 {
Geoff Lang309c92a2013-07-25 16:23:19 -04001908 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
1909 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
1910 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001911 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001912 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001913 }
1914 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001915 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
1919}
1920
1921void __stdcall glFrontFace(GLenum mode)
1922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001923 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924
1925 try
1926 {
1927 switch (mode)
1928 {
1929 case GL_CW:
1930 case GL_CCW:
1931 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001932 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933
1934 if (context)
1935 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001936 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001937 }
1938 }
1939 break;
1940 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001941 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001942 }
1943 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001944 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001946 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947 }
1948}
1949
1950void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001952 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953
1954 try
1955 {
1956 if (n < 0)
1957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959 }
1960
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962
1963 if (context)
1964 {
1965 for (int i = 0; i < n; i++)
1966 {
1967 buffers[i] = context->createBuffer();
1968 }
1969 }
1970 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001971 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001974 }
1975}
1976
1977void __stdcall glGenerateMipmap(GLenum target)
1978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001979 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980
1981 try
1982 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001984
1985 if (context)
1986 {
Jamie Madill35d15012013-10-07 10:46:37 -04001987 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001989 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001990 }
Geoff Langae4852a2013-06-05 15:00:34 -04001991
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001992 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04001993
1994 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04001995 {
1996 return gl::error(GL_INVALID_OPERATION);
1997 }
1998
Geoff Lang005df412013-10-16 14:12:50 -04001999 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Geoff Langcec35902014-04-16 10:52:36 -04002000 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalFormat);
2001
Geoff Langcbb84122014-06-11 15:30:32 -04002002 // GenerateMipmap should not generate an INVALID_OPERATION for textures created with
2003 // unsized formats or that are color renderable and filterable. Since we do not track if
2004 // the texture was created with sized or unsized format (only sized formats are stored),
2005 // it is not possible to make sure the the LUMA formats can generate mipmaps (they should
2006 // be able to) because they aren't color renderable. Simply do a special case for LUMA
2007 // textures since they're the only texture format that can be created with unsized formats
2008 // that is not color renderable. New unsized formats are unlikely to be added, since ES2
2009 // was the last version to use add them.
2010 bool isLUMA = internalFormat == GL_LUMINANCE8_EXT ||
2011 internalFormat == GL_LUMINANCE8_ALPHA8_EXT ||
2012 internalFormat == GL_ALPHA8_EXT;
Jamie Madill61b54432014-02-18 15:27:19 -05002013
Geoff Langcbb84122014-06-11 15:30:32 -04002014 if (formatCaps.depthRendering || !formatCaps.filtering || (!formatCaps.colorRendering && !isLUMA) ||
2015 gl::IsFormatCompressed(internalFormat, context->getClientVersion()))
Geoff Langae4852a2013-06-05 15:00:34 -04002016 {
2017 return gl::error(GL_INVALID_OPERATION);
2018 }
2019
Geoff Lang05b05022014-06-11 15:31:45 -04002020 // GL_EXT_sRGB does not support mipmap generation on sRGB textures
2021 if (context->getClientVersion() == 2 &&
2022 gl::GetColorEncoding(internalFormat, context->getClientVersion()) == GL_SRGB)
2023 {
2024 return gl::error(GL_INVALID_OPERATION);
2025 }
2026
Jamie Madillc1f8b162013-10-07 10:46:38 -04002027 // Non-power of 2 ES2 check
Geoff Langcec35902014-04-16 10:52:36 -04002028 if (!context->getCaps().extensions.textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
Jamie Madillc1f8b162013-10-07 10:46:38 -04002029 {
2030 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2031 return gl::error(GL_INVALID_OPERATION);
2032 }
2033
2034 // Cube completeness check
2035 if (target == GL_TEXTURE_CUBE_MAP)
2036 {
2037 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2038 if (!textureCube->isCubeComplete())
2039 {
2040 return gl::error(GL_INVALID_OPERATION);
2041 }
2042 }
2043
Geoff Langae4852a2013-06-05 15:00:34 -04002044 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002045 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002047 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002049 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050 }
2051}
2052
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002053void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2054{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002055 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002056
2057 try
2058 {
2059 if (n < 0)
2060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002061 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002062 }
2063
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002064 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002065
2066 if (context)
2067 {
2068 for (int i = 0; i < n; i++)
2069 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002070 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002071 }
2072 }
2073 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002074 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002076 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002077 }
2078}
2079
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002080void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002082 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002083
2084 try
2085 {
2086 if (n < 0)
2087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002088 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002089 }
2090
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092
2093 if (context)
2094 {
2095 for (int i = 0; i < n; i++)
2096 {
2097 framebuffers[i] = context->createFramebuffer();
2098 }
2099 }
2100 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002101 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002103 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002104 }
2105}
2106
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002107void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2108{
2109 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2110
2111 try
2112 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002113 gl::Context *context = gl::getNonLostContext();
2114
2115 if (context)
2116 {
Geoff Lang37dde692014-01-31 16:34:54 -05002117 if (n < 0)
2118 {
2119 return gl::error(GL_INVALID_VALUE);
2120 }
2121
2122 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002123 {
2124 ids[i] = context->createQuery();
2125 }
2126 }
2127 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002128 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002131 }
2132}
2133
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002136 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002137
2138 try
2139 {
2140 if (n < 0)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002143 }
2144
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002146
2147 if (context)
2148 {
2149 for (int i = 0; i < n; i++)
2150 {
2151 renderbuffers[i] = context->createRenderbuffer();
2152 }
2153 }
2154 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002155 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158 }
2159}
2160
2161void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2162{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002163 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164
2165 try
2166 {
2167 if (n < 0)
2168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173
2174 if (context)
2175 {
2176 for (int i = 0; i < n; i++)
2177 {
2178 textures[i] = context->createTexture();
2179 }
2180 }
2181 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002182 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
daniel@transgaming.com85423182010-04-22 13:35:27 +00002188void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002190 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002191 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002192 program, index, bufsize, length, size, type, name);
2193
2194 try
2195 {
2196 if (bufsize < 0)
2197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002198 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002199 }
2200
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002201 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002202
2203 if (context)
2204 {
2205 gl::Program *programObject = context->getProgram(program);
2206
2207 if (!programObject)
2208 {
2209 if (context->getShader(program))
2210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002211 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002212 }
2213 else
2214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002216 }
2217 }
2218
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002219 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002222 }
2223
2224 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2225 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002226 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002227 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 }
2231}
2232
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002233void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002235 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002236 "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 +00002237 program, index, bufsize, length, size, type, name);
2238
2239 try
2240 {
2241 if (bufsize < 0)
2242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002243 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244 }
2245
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002246 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002247
2248 if (context)
2249 {
2250 gl::Program *programObject = context->getProgram(program);
2251
2252 if (!programObject)
2253 {
2254 if (context->getShader(program))
2255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002256 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002257 }
2258 else
2259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002260 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002261 }
2262 }
2263
2264 if (index >= (GLuint)programObject->getActiveUniformCount())
2265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002266 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002267 }
2268
2269 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2270 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002272 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002274 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002275 }
2276}
2277
2278void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2279{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002280 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 +00002281 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002282
2283 try
2284 {
2285 if (maxcount < 0)
2286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002288 }
2289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002291
2292 if (context)
2293 {
2294 gl::Program *programObject = context->getProgram(program);
2295
2296 if (!programObject)
2297 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002298 if (context->getShader(program))
2299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002300 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002301 }
2302 else
2303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002305 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002306 }
2307
2308 return programObject->getAttachedShaders(maxcount, count, shaders);
2309 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002311 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002314 }
2315}
2316
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002317int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002319 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002320
2321 try
2322 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002323 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002324
2325 if (context)
2326 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002327
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328 gl::Program *programObject = context->getProgram(program);
2329
2330 if (!programObject)
2331 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002332 if (context->getShader(program))
2333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002334 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002335 }
2336 else
2337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002338 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002339 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340 }
2341
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002342 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002343 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002345 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002346 }
2347
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002348 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002349 }
2350 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002351 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354 }
2355
2356 return -1;
2357}
2358
2359void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362
2363 try
2364 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002366
2367 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002369 GLenum nativeType;
2370 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002371 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2372 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002373 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002374 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002375
2376 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002377 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002378 context->getBooleanv(pname, params);
2379 }
Jamie Madill55856b12014-01-02 13:59:50 -05002380 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002381 {
Jamie Madill55856b12014-01-02 13:59:50 -05002382 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002383 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002386 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002388 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389 }
2390}
2391
2392void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2393{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002394 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 +00002395
2396 try
2397 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002398 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002399
2400 if (context)
2401 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002402 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002403 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002404 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002405 }
2406
Jamie Madill70656a62014-03-05 15:01:26 -05002407 if (!gl::ValidBufferParameter(context, pname))
2408 {
2409 return gl::error(GL_INVALID_ENUM);
2410 }
2411
Jamie Madill8c96d582014-03-05 15:01:23 -05002412 gl::Buffer *buffer = context->getTargetBuffer(target);
2413
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002414 if (!buffer)
2415 {
2416 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002417 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002418 }
2419
2420 switch (pname)
2421 {
2422 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002423 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002424 break;
2425 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002426 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002427 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002428 case GL_BUFFER_ACCESS_FLAGS:
2429 *params = buffer->accessFlags();
2430 break;
2431 case GL_BUFFER_MAPPED:
2432 *params = static_cast<GLint>(buffer->mapped());
2433 break;
2434 case GL_BUFFER_MAP_OFFSET:
2435 *params = gl::clampCast<GLint>(buffer->mapOffset());
2436 break;
2437 case GL_BUFFER_MAP_LENGTH:
2438 *params = gl::clampCast<GLint>(buffer->mapLength());
2439 break;
2440 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002441 }
2442 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002444 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002446 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447 }
2448}
2449
2450GLenum __stdcall glGetError(void)
2451{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002452 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453
2454 gl::Context *context = gl::getContext();
2455
2456 if (context)
2457 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002458 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459 }
2460
2461 return GL_NO_ERROR;
2462}
2463
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002464void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002466 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002467
2468 try
2469 {
2470
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002471 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002472
2473 if (context)
2474 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002475 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002476
2477 if (fenceObject == NULL)
2478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002479 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002480 }
2481
Jamie Madillfb9a7402013-07-26 11:55:01 -04002482 if (fenceObject->isFence() != GL_TRUE)
2483 {
2484 return gl::error(GL_INVALID_OPERATION);
2485 }
2486
2487 switch (pname)
2488 {
2489 case GL_FENCE_STATUS_NV:
2490 case GL_FENCE_CONDITION_NV:
2491 break;
2492
2493 default: return gl::error(GL_INVALID_ENUM);
2494 }
2495
2496 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002497 }
2498 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002499 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002501 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002502 }
2503}
2504
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2506{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002507 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002508
2509 try
2510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002512
2513 if (context)
2514 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002515 GLenum nativeType;
2516 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002517 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2518 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002519 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002520 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002521
2522 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002523 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002524 context->getFloatv(pname, params);
2525 }
Jamie Madill55856b12014-01-02 13:59:50 -05002526 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002527 {
Jamie Madill55856b12014-01-02 13:59:50 -05002528 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002529 }
2530 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002532 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 }
2536}
2537
2538void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002540 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 +00002541 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542
2543 try
2544 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002545 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002546
2547 if (context)
2548 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002549 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002551 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002552 }
2553
Jamie Madill1e3fa742014-06-16 10:34:00 -04002554 int clientVersion = context->getClientVersion();
2555
Geoff Lang646559f2013-08-15 11:08:15 -04002556 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002557 {
Geoff Lang646559f2013-08-15 11:08:15 -04002558 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2559 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2560 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2561 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2562 break;
Geoff Lang05b05022014-06-11 15:31:45 -04002563 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2564 if (clientVersion < 3 && !context->getCaps().extensions.sRGB)
2565 {
2566 return gl::error(GL_INVALID_ENUM);
2567 }
2568 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002569 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2570 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2571 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2572 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2573 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2574 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2575 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
Geoff Lang646559f2013-08-15 11:08:15 -04002576 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
Geoff Lang05b05022014-06-11 15:31:45 -04002577 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002578 {
Geoff Lang05b05022014-06-11 15:31:45 -04002579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002580 }
Geoff Lang05b05022014-06-11 15:31:45 -04002581 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002582 default:
2583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002584 }
Geoff Lang646559f2013-08-15 11:08:15 -04002585
2586 // Determine if the attachment is a valid enum
2587 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002588 {
Geoff Lang646559f2013-08-15 11:08:15 -04002589 case GL_BACK:
2590 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002591 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002592 case GL_STENCIL:
2593 case GL_DEPTH_STENCIL_ATTACHMENT:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002594 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002595 {
Geoff Lang646559f2013-08-15 11:08:15 -04002596 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002597 }
Geoff Lang646559f2013-08-15 11:08:15 -04002598 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002599
Geoff Lang646559f2013-08-15 11:08:15 -04002600 case GL_DEPTH_ATTACHMENT:
2601 case GL_STENCIL_ATTACHMENT:
2602 break;
2603
2604 default:
2605 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2606 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2607 {
2608 return gl::error(GL_INVALID_ENUM);
2609 }
2610 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002611 }
2612
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002613 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2614 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002615 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2616
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002617 GLenum attachmentType;
2618 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002619 GLuint attachmentLevel;
2620 GLuint attachmentLayer;
Jamie Madille261b442014-06-25 12:42:21 -04002621 const gl::FramebufferAttachment *attachmentObject;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002622
Jamie Madill3c7fa222014-06-05 13:08:51 -04002623 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002624 {
Jamie Madill1e3fa742014-06-16 10:34:00 -04002625 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002626 {
Geoff Lang646559f2013-08-15 11:08:15 -04002627 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002628 }
2629
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002630 switch (attachment)
2631 {
Geoff Lang646559f2013-08-15 11:08:15 -04002632 case GL_BACK:
2633 attachmentType = framebuffer->getColorbufferType(0);
2634 attachmentHandle = framebuffer->getColorbufferHandle(0);
2635 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2636 attachmentLayer = framebuffer->getColorbufferLayer(0);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002637 attachmentObject = framebuffer->getColorbuffer(0);
Geoff Lang646559f2013-08-15 11:08:15 -04002638 break;
2639 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002640 attachmentType = framebuffer->getDepthbufferType();
2641 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002642 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2643 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002644 attachmentObject = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002645 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002646 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002647 attachmentType = framebuffer->getStencilbufferType();
2648 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002649 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2650 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002651 attachmentObject = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002652 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002653 default:
2654 return gl::error(GL_INVALID_OPERATION);
2655 }
2656 }
2657 else
2658 {
2659 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2660 {
2661 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2662 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2663 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2664 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2665 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002666 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
Geoff Lang646559f2013-08-15 11:08:15 -04002667 }
2668 else
2669 {
2670 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002671 {
Geoff Lang646559f2013-08-15 11:08:15 -04002672 case GL_DEPTH_ATTACHMENT:
2673 attachmentType = framebuffer->getDepthbufferType();
2674 attachmentHandle = framebuffer->getDepthbufferHandle();
2675 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2676 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002677 attachmentObject = framebuffer->getDepthbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002678 break;
2679 case GL_STENCIL_ATTACHMENT:
2680 attachmentType = framebuffer->getStencilbufferType();
2681 attachmentHandle = framebuffer->getStencilbufferHandle();
2682 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2683 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002684 attachmentObject = framebuffer->getStencilbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002685 break;
2686 case GL_DEPTH_STENCIL_ATTACHMENT:
2687 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2688 {
2689 return gl::error(GL_INVALID_OPERATION);
2690 }
2691 attachmentType = framebuffer->getDepthStencilbufferType();
2692 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2693 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2694 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002695 attachmentObject = framebuffer->getDepthStencilBuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002696 break;
2697 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002698 return gl::error(GL_INVALID_OPERATION);
2699 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002700 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701 }
2702
2703 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002704 if (framebufferHandle == 0)
2705 {
2706 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2707 }
2708 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002709 {
2710 attachmentObjectType = attachmentType;
2711 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002712 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002713 {
2714 attachmentObjectType = GL_TEXTURE;
2715 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002716 else
2717 {
2718 UNREACHABLE();
2719 return;
2720 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002721
Geoff Lang646559f2013-08-15 11:08:15 -04002722 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002723 {
Geoff Lang646559f2013-08-15 11:08:15 -04002724 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2725 // is NONE, then querying any other pname will generate INVALID_ENUM.
2726
2727 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2728 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2729 // INVALID_OPERATION for all other pnames
2730
2731 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002732 {
Geoff Lang646559f2013-08-15 11:08:15 -04002733 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2734 *params = attachmentObjectType;
2735 break;
2736
2737 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002738 if (clientVersion < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002739 {
Geoff Lang646559f2013-08-15 11:08:15 -04002740 return gl::error(GL_INVALID_ENUM);
2741 }
2742 *params = 0;
2743 break;
2744
2745 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002746 if (clientVersion < 3)
Geoff Lang646559f2013-08-15 11:08:15 -04002747 {
2748 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002749 }
2750 else
2751 {
Geoff Lang646559f2013-08-15 11:08:15 -04002752 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002753 }
2754 }
Geoff Lang646559f2013-08-15 11:08:15 -04002755 }
2756 else
2757 {
2758 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2759 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002760 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002761
2762 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002763 {
Geoff Lang646559f2013-08-15 11:08:15 -04002764 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2765 *params = attachmentObjectType;
2766 break;
2767
2768 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2769 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2770 {
2771 return gl::error(GL_INVALID_ENUM);
2772 }
2773 *params = attachmentHandle;
2774 break;
2775
2776 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2777 if (attachmentObjectType != GL_TEXTURE)
2778 {
2779 return gl::error(GL_INVALID_ENUM);
2780 }
2781 *params = attachmentLevel;
2782 break;
2783
2784 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2785 if (attachmentObjectType != GL_TEXTURE)
2786 {
2787 return gl::error(GL_INVALID_ENUM);
2788 }
2789 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2790 break;
2791
2792 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002793 *params = attachmentObject->getRedSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002794 break;
2795
2796 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002797 *params = attachmentObject->getGreenSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002798 break;
2799
2800 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002801 *params = attachmentObject->getBlueSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002802 break;
2803
2804 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002805 *params = attachmentObject->getAlphaSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002806 break;
2807
2808 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002809 *params = attachmentObject->getDepthSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002810 break;
2811
2812 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002813 *params = attachmentObject->getStencilSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002814 break;
2815
2816 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2817 if (attachment == GL_DEPTH_STENCIL)
2818 {
2819 gl::error(GL_INVALID_OPERATION);
2820 }
Jamie Madill1e3fa742014-06-16 10:34:00 -04002821 *params = attachmentObject->getComponentType(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002822 break;
2823
2824 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002825 *params = attachmentObject->getColorEncoding(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002826 break;
2827
2828 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2829 if (attachmentObjectType != GL_TEXTURE)
2830 {
2831 return gl::error(GL_INVALID_ENUM);
2832 }
2833 *params = attachmentLayer;
2834 break;
2835
2836 default:
2837 UNREACHABLE();
2838 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002839 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002840 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002841 }
2842 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002843 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846 }
2847}
2848
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002849GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2850{
2851 EVENT("()");
2852
2853 try
2854 {
2855 gl::Context *context = gl::getContext();
2856
2857 if (context)
2858 {
2859 return context->getResetStatus();
2860 }
2861
2862 return GL_NO_ERROR;
2863 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002864 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002865 {
2866 return GL_OUT_OF_MEMORY;
2867 }
2868}
2869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002872 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873
2874 try
2875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002877
2878 if (context)
2879 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002880 GLenum nativeType;
2881 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002882
Jamie Madill893ab082014-05-16 16:56:10 -04002883 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2884 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002885 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002886 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002887
2888 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002890 context->getIntegerv(pname, params);
2891 }
Jamie Madill55856b12014-01-02 13:59:50 -05002892 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002893 {
Jamie Madill55856b12014-01-02 13:59:50 -05002894 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002895 }
2896 }
2897 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002898 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002901 }
2902}
2903
2904void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002906 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002907
2908 try
2909 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002910 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002911
2912 if (context)
2913 {
2914 gl::Program *programObject = context->getProgram(program);
2915
2916 if (!programObject)
2917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002918 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919 }
2920
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002921 if (context->getClientVersion() < 3)
2922 {
2923 switch (pname)
2924 {
2925 case GL_ACTIVE_UNIFORM_BLOCKS:
2926 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002927 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2928 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2929 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002930 return gl::error(GL_INVALID_ENUM);
2931 }
2932 }
2933
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 switch (pname)
2935 {
2936 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002937 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002938 return;
2939 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002940 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002941 return;
2942 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002943 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 return;
2945 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002946 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947 return;
2948 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002949 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002950 return;
2951 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002952 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953 return;
2954 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002955 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956 return;
2957 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002958 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 return;
2960 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002961 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002963 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00002964 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002965 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002966 case GL_ACTIVE_UNIFORM_BLOCKS:
2967 *params = programObject->getActiveUniformBlockCount();
2968 return;
2969 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2970 *params = programObject->getActiveUniformBlockMaxLength();
2971 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002972 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2973 *params = programObject->getTransformFeedbackBufferMode();
2974 break;
2975 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2976 *params = programObject->getTransformFeedbackVaryingCount();
2977 break;
2978 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2979 *params = programObject->getTransformFeedbackVaryingMaxLength();
2980 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002982 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983 }
2984 }
2985 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002986 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002988 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989 }
2990}
2991
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002992void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002993{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002994 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 +00002995 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996
2997 try
2998 {
2999 if (bufsize < 0)
3000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 }
3003
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003004 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003005
3006 if (context)
3007 {
3008 gl::Program *programObject = context->getProgram(program);
3009
3010 if (!programObject)
3011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003012 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003013 }
3014
3015 programObject->getInfoLog(bufsize, length, infolog);
3016 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003018 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003021 }
3022}
3023
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003024void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3025{
3026 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3027
3028 try
3029 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003030 gl::Context *context = gl::getNonLostContext();
3031
3032 if (context)
3033 {
Geoff Lang37dde692014-01-31 16:34:54 -05003034 if (!ValidQueryType(context, target))
3035 {
3036 return gl::error(GL_INVALID_ENUM);
3037 }
3038
3039 switch (pname)
3040 {
3041 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003042 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003043 break;
3044
3045 default:
3046 return gl::error(GL_INVALID_ENUM);
3047 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003048 }
3049 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003050 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003052 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003053 }
3054}
3055
3056void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3057{
3058 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3059
3060 try
3061 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003062 gl::Context *context = gl::getNonLostContext();
3063
3064 if (context)
3065 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003066 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3067
3068 if (!queryObject)
3069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003070 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003071 }
3072
Jamie Madill45c785d2014-05-13 14:09:34 -04003073 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003075 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003076 }
3077
3078 switch(pname)
3079 {
3080 case GL_QUERY_RESULT_EXT:
3081 params[0] = queryObject->getResult();
3082 break;
3083 case GL_QUERY_RESULT_AVAILABLE_EXT:
3084 params[0] = queryObject->isResultAvailable();
3085 break;
3086 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003087 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003088 }
3089 }
3090 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003091 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003093 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003094 }
3095}
3096
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003097void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003099 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 +00003100
3101 try
3102 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003103 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003104
3105 if (context)
3106 {
3107 if (target != GL_RENDERBUFFER)
3108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003109 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003110 }
3111
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003112 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003115 }
3116
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003117 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003118
3119 switch (pname)
3120 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003121 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3122 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3123 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3124 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3125 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3126 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3127 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3128 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3129 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003130 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langcec35902014-04-16 10:52:36 -04003131 if (!context->getCaps().extensions.framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003133 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003134 }
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003135 *params = renderbuffer->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003136 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003137 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003138 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003139 }
3140 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003141 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003142 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003144 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003145 }
3146}
3147
3148void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003150 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003151
3152 try
3153 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003154 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155
3156 if (context)
3157 {
3158 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003159
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003160 if (!shaderObject)
3161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003162 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003163 }
3164
3165 switch (pname)
3166 {
3167 case GL_SHADER_TYPE:
3168 *params = shaderObject->getType();
3169 return;
3170 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003171 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003172 return;
3173 case GL_COMPILE_STATUS:
3174 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3175 return;
3176 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003177 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178 return;
3179 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003180 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003182 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3183 *params = shaderObject->getTranslatedSourceLength();
3184 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003185 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003186 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003187 }
3188 }
3189 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003190 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003192 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003193 }
3194}
3195
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003196void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003198 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 +00003199 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003200
3201 try
3202 {
3203 if (bufsize < 0)
3204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003205 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003206 }
3207
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003209
3210 if (context)
3211 {
3212 gl::Shader *shaderObject = context->getShader(shader);
3213
3214 if (!shaderObject)
3215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003216 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003217 }
3218
3219 shaderObject->getInfoLog(bufsize, length, infolog);
3220 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003221 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003222 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003224 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225 }
3226}
3227
3228void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3229{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003230 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 +00003231 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232
3233 try
3234 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003235 switch (shadertype)
3236 {
3237 case GL_VERTEX_SHADER:
3238 case GL_FRAGMENT_SHADER:
3239 break;
3240 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003241 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003242 }
3243
3244 switch (precisiontype)
3245 {
3246 case GL_LOW_FLOAT:
3247 case GL_MEDIUM_FLOAT:
3248 case GL_HIGH_FLOAT:
3249 // Assume IEEE 754 precision
3250 range[0] = 127;
3251 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003252 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003253 break;
3254 case GL_LOW_INT:
3255 case GL_MEDIUM_INT:
3256 case GL_HIGH_INT:
3257 // Some (most) hardware only supports single-precision floating-point numbers,
3258 // which can accurately represent integers up to +/-16777216
3259 range[0] = 24;
3260 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003261 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003262 break;
3263 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003264 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003265 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003267 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 }
3271}
3272
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003273void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003275 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 +00003276 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277
3278 try
3279 {
3280 if (bufsize < 0)
3281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 }
3284
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003286
3287 if (context)
3288 {
3289 gl::Shader *shaderObject = context->getShader(shader);
3290
3291 if (!shaderObject)
3292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003293 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003294 }
3295
3296 shaderObject->getSource(bufsize, length, source);
3297 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003298 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003299 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003301 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302 }
3303}
3304
zmo@google.coma574f782011-10-03 21:45:23 +00003305void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3306{
3307 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3308 shader, bufsize, length, source);
3309
3310 try
3311 {
3312 if (bufsize < 0)
3313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003314 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003315 }
3316
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003317 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003318
3319 if (context)
3320 {
3321 gl::Shader *shaderObject = context->getShader(shader);
3322
3323 if (!shaderObject)
3324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003325 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003326 }
3327
3328 shaderObject->getTranslatedSource(bufsize, length, source);
3329 }
3330 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003331 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003333 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003334 }
3335}
3336
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003337const GLubyte* __stdcall glGetString(GLenum name)
3338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003339 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340
3341 try
3342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003344
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003345 switch (name)
3346 {
3347 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003348 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003350 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003352 if (context->getClientVersion() == 2)
3353 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003354 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003355 }
3356 else
3357 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003358 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003359 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003361 if (context->getClientVersion() == 2)
3362 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003363 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003364 }
3365 else
3366 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003367 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003368 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003369 case GL_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04003370 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003372 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003373 }
3374 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003375 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379}
3380
3381void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003383 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 +00003384
3385 try
3386 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003388
3389 if (context)
3390 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003391 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003392
Jamie Madillfb8a8302013-07-03 14:24:12 -04003393 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003395 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003396 }
3397
3398 switch (pname)
3399 {
3400 case GL_TEXTURE_MAG_FILTER:
3401 *params = (GLfloat)texture->getMagFilter();
3402 break;
3403 case GL_TEXTURE_MIN_FILTER:
3404 *params = (GLfloat)texture->getMinFilter();
3405 break;
3406 case GL_TEXTURE_WRAP_S:
3407 *params = (GLfloat)texture->getWrapS();
3408 break;
3409 case GL_TEXTURE_WRAP_T:
3410 *params = (GLfloat)texture->getWrapT();
3411 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003412 case GL_TEXTURE_WRAP_R:
3413 if (context->getClientVersion() < 3)
3414 {
3415 return gl::error(GL_INVALID_ENUM);
3416 }
3417 *params = (GLfloat)texture->getWrapR();
3418 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003419 case GL_TEXTURE_IMMUTABLE_FORMAT:
3420 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003421 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3422 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003423 case GL_TEXTURE_IMMUTABLE_LEVELS:
3424 if (context->getClientVersion() < 3)
3425 {
3426 return gl::error(GL_INVALID_ENUM);
3427 }
Jamie Madill51a94372013-10-24 17:49:43 -04003428 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003429 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003430 case GL_TEXTURE_USAGE_ANGLE:
3431 *params = (GLfloat)texture->getUsage();
3432 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003433 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003434 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003436 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003437 }
3438 *params = (GLfloat)texture->getMaxAnisotropy();
3439 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003440 case GL_TEXTURE_SWIZZLE_R:
3441 if (context->getClientVersion() < 3)
3442 {
3443 return gl::error(GL_INVALID_ENUM);
3444 }
3445 *params = (GLfloat)texture->getSwizzleRed();
3446 break;
3447 case GL_TEXTURE_SWIZZLE_G:
3448 if (context->getClientVersion() < 3)
3449 {
3450 return gl::error(GL_INVALID_ENUM);
3451 }
3452 *params = (GLfloat)texture->getSwizzleGreen();
3453 break;
3454 case GL_TEXTURE_SWIZZLE_B:
3455 if (context->getClientVersion() < 3)
3456 {
3457 return gl::error(GL_INVALID_ENUM);
3458 }
3459 *params = (GLfloat)texture->getSwizzleBlue();
3460 break;
3461 case GL_TEXTURE_SWIZZLE_A:
3462 if (context->getClientVersion() < 3)
3463 {
3464 return gl::error(GL_INVALID_ENUM);
3465 }
3466 *params = (GLfloat)texture->getSwizzleAlpha();
3467 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003468 case GL_TEXTURE_BASE_LEVEL:
3469 if (context->getClientVersion() < 3)
3470 {
3471 return gl::error(GL_INVALID_ENUM);
3472 }
3473 *params = (GLfloat)texture->getBaseLevel();
3474 break;
3475 case GL_TEXTURE_MAX_LEVEL:
3476 if (context->getClientVersion() < 3)
3477 {
3478 return gl::error(GL_INVALID_ENUM);
3479 }
3480 *params = (GLfloat)texture->getMaxLevel();
3481 break;
3482 case GL_TEXTURE_MIN_LOD:
3483 if (context->getClientVersion() < 3)
3484 {
3485 return gl::error(GL_INVALID_ENUM);
3486 }
3487 *params = texture->getMinLod();
3488 break;
3489 case GL_TEXTURE_MAX_LOD:
3490 if (context->getClientVersion() < 3)
3491 {
3492 return gl::error(GL_INVALID_ENUM);
3493 }
3494 *params = texture->getMaxLod();
3495 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003496 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003497 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003498 }
3499 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003500 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003501 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003503 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003504 }
3505}
3506
3507void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3508{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003509 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 +00003510
3511 try
3512 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003514
3515 if (context)
3516 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003517 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003518
Jamie Madillfb8a8302013-07-03 14:24:12 -04003519 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003522 }
3523
3524 switch (pname)
3525 {
3526 case GL_TEXTURE_MAG_FILTER:
3527 *params = texture->getMagFilter();
3528 break;
3529 case GL_TEXTURE_MIN_FILTER:
3530 *params = texture->getMinFilter();
3531 break;
3532 case GL_TEXTURE_WRAP_S:
3533 *params = texture->getWrapS();
3534 break;
3535 case GL_TEXTURE_WRAP_T:
3536 *params = texture->getWrapT();
3537 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003538 case GL_TEXTURE_WRAP_R:
3539 if (context->getClientVersion() < 3)
3540 {
3541 return gl::error(GL_INVALID_ENUM);
3542 }
3543 *params = texture->getWrapR();
3544 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003545 case GL_TEXTURE_IMMUTABLE_FORMAT:
3546 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003547 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3548 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003549 case GL_TEXTURE_IMMUTABLE_LEVELS:
3550 if (context->getClientVersion() < 3)
3551 {
3552 return gl::error(GL_INVALID_ENUM);
3553 }
Jamie Madill51a94372013-10-24 17:49:43 -04003554 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003555 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003556 case GL_TEXTURE_USAGE_ANGLE:
3557 *params = texture->getUsage();
3558 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003559 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003560 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003562 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003563 }
3564 *params = (GLint)texture->getMaxAnisotropy();
3565 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003566 case GL_TEXTURE_SWIZZLE_R:
3567 if (context->getClientVersion() < 3)
3568 {
3569 return gl::error(GL_INVALID_ENUM);
3570 }
3571 *params = texture->getSwizzleRed();
3572 break;
3573 case GL_TEXTURE_SWIZZLE_G:
3574 if (context->getClientVersion() < 3)
3575 {
3576 return gl::error(GL_INVALID_ENUM);
3577 }
3578 *params = texture->getSwizzleGreen();
3579 break;
3580 case GL_TEXTURE_SWIZZLE_B:
3581 if (context->getClientVersion() < 3)
3582 {
3583 return gl::error(GL_INVALID_ENUM);
3584 }
3585 *params = texture->getSwizzleBlue();
3586 break;
3587 case GL_TEXTURE_SWIZZLE_A:
3588 if (context->getClientVersion() < 3)
3589 {
3590 return gl::error(GL_INVALID_ENUM);
3591 }
3592 *params = texture->getSwizzleAlpha();
3593 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003594 case GL_TEXTURE_BASE_LEVEL:
3595 if (context->getClientVersion() < 3)
3596 {
3597 return gl::error(GL_INVALID_ENUM);
3598 }
3599 *params = texture->getBaseLevel();
3600 break;
3601 case GL_TEXTURE_MAX_LEVEL:
3602 if (context->getClientVersion() < 3)
3603 {
3604 return gl::error(GL_INVALID_ENUM);
3605 }
3606 *params = texture->getMaxLevel();
3607 break;
3608 case GL_TEXTURE_MIN_LOD:
3609 if (context->getClientVersion() < 3)
3610 {
3611 return gl::error(GL_INVALID_ENUM);
3612 }
3613 *params = (GLint)texture->getMinLod();
3614 break;
3615 case GL_TEXTURE_MAX_LOD:
3616 if (context->getClientVersion() < 3)
3617 {
3618 return gl::error(GL_INVALID_ENUM);
3619 }
3620 *params = (GLint)texture->getMaxLod();
3621 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003622 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003623 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003624 }
3625 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003627 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003629 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630 }
3631}
3632
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003633void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3634{
3635 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3636 program, location, bufSize, params);
3637
3638 try
3639 {
3640 if (bufSize < 0)
3641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003643 }
3644
3645 gl::Context *context = gl::getNonLostContext();
3646
3647 if (context)
3648 {
3649 if (program == 0)
3650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003652 }
3653
3654 gl::Program *programObject = context->getProgram(program);
3655
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003656 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003658 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003659 }
3660
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003661 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3662 if (!programBinary)
3663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003664 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003665 }
3666
3667 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003669 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003670 }
3671 }
3672 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003673 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003676 }
3677}
3678
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003681 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003682
3683 try
3684 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003686
3687 if (context)
3688 {
3689 if (program == 0)
3690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003691 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003692 }
3693
3694 gl::Program *programObject = context->getProgram(program);
3695
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003696 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003699 }
3700
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003701 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3702 if (!programBinary)
3703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003704 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003705 }
3706
3707 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003709 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003710 }
3711 }
3712 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003713 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003716 }
3717}
3718
3719void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3720{
3721 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3722 program, location, bufSize, params);
3723
3724 try
3725 {
3726 if (bufSize < 0)
3727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003729 }
3730
3731 gl::Context *context = gl::getNonLostContext();
3732
3733 if (context)
3734 {
3735 if (program == 0)
3736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003737 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003738 }
3739
3740 gl::Program *programObject = context->getProgram(program);
3741
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003742 if (!programObject || !programObject->isLinked())
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
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003747 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3748 if (!programBinary)
3749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003750 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003751 }
3752
3753 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003756 }
3757 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003758 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003759 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003762 }
3763}
3764
3765void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003767 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003768
3769 try
3770 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003772
3773 if (context)
3774 {
3775 if (program == 0)
3776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003777 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003778 }
3779
3780 gl::Program *programObject = context->getProgram(program);
3781
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003782 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003784 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003785 }
3786
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003787 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3788 if (!programBinary)
3789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003790 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003791 }
3792
3793 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003795 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003796 }
3797 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003799 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003801 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802 }
3803}
3804
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003805int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003807 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808
3809 try
3810 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812
3813 if (strstr(name, "gl_") == name)
3814 {
3815 return -1;
3816 }
3817
3818 if (context)
3819 {
3820 gl::Program *programObject = context->getProgram(program);
3821
3822 if (!programObject)
3823 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003824 if (context->getShader(program))
3825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003826 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003827 }
3828 else
3829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003830 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003831 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832 }
3833
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003834 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003835 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003837 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003838 }
3839
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003840 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003841 }
3842 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003843 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003845 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003846 }
3847
3848 return -1;
3849}
3850
3851void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003853 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003854
3855 try
3856 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858
daniel@transgaming.come0078962010-04-15 20:45:08 +00003859 if (context)
3860 {
3861 if (index >= gl::MAX_VERTEX_ATTRIBS)
3862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003864 }
3865
daniel@transgaming.com83921382011-01-08 05:46:00 +00003866 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003867
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003868 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003869 {
Jamie Madillaff71502013-07-02 11:57:05 -04003870 return;
3871 }
3872
3873 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3874 {
3875 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3876 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003877 {
Jamie Madillaff71502013-07-02 11:57:05 -04003878 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003879 }
Jamie Madillaff71502013-07-02 11:57:05 -04003880 }
3881 else
3882 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003883 *params = gl::QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003884 }
3885 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003886 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003887 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003889 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003890 }
3891}
3892
3893void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3894{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003895 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003896
3897 try
3898 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003899 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003900
daniel@transgaming.come0078962010-04-15 20:45:08 +00003901 if (context)
3902 {
3903 if (index >= gl::MAX_VERTEX_ATTRIBS)
3904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003905 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003906 }
3907
daniel@transgaming.com83921382011-01-08 05:46:00 +00003908 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003909
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003910 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003911 {
Jamie Madillaff71502013-07-02 11:57:05 -04003912 return;
3913 }
3914
3915 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3916 {
3917 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3918 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003919 {
Jamie Madillaff71502013-07-02 11:57:05 -04003920 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003921 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003922 }
Jamie Madillaff71502013-07-02 11:57:05 -04003923 }
3924 else
3925 {
Brandon Jones5bf98292014-06-06 17:19:38 -07003926 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003927 }
3928 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003929 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003930 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003933 }
3934}
3935
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003936void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003938 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939
3940 try
3941 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003942 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003943
daniel@transgaming.come0078962010-04-15 20:45:08 +00003944 if (context)
3945 {
3946 if (index >= gl::MAX_VERTEX_ATTRIBS)
3947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003948 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003949 }
3950
3951 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003954 }
3955
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003956 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003957 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003958 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003959 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003962 }
3963}
3964
3965void __stdcall glHint(GLenum target, GLenum mode)
3966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003967 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003968
3969 try
3970 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003971 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003972 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003973 case GL_FASTEST:
3974 case GL_NICEST:
3975 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003976 break;
3977 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003978 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003979 }
3980
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003981 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003982 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003983 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003984 case GL_GENERATE_MIPMAP_HINT:
3985 if (context) context->setGenerateMipmapHint(mode);
3986 break;
3987 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3988 if (context) context->setFragmentShaderDerivativeHint(mode);
3989 break;
3990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003992 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003993 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003994 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003995 {
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
4000GLboolean __stdcall glIsBuffer(GLuint buffer)
4001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004002 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003
4004 try
4005 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004006 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007
4008 if (context && buffer)
4009 {
4010 gl::Buffer *bufferObject = context->getBuffer(buffer);
4011
4012 if (bufferObject)
4013 {
4014 return GL_TRUE;
4015 }
4016 }
4017 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004018 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004020 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021 }
4022
4023 return GL_FALSE;
4024}
4025
4026GLboolean __stdcall glIsEnabled(GLenum cap)
4027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004028 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029
4030 try
4031 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033
4034 if (context)
4035 {
Geoff Lang0550d032014-01-30 11:29:07 -05004036 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004038 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039 }
Geoff Lang0550d032014-01-30 11:29:07 -05004040
4041 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042 }
4043 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004044 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047 }
4048
4049 return false;
4050}
4051
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004052GLboolean __stdcall glIsFenceNV(GLuint fence)
4053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004054 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004055
4056 try
4057 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004059
4060 if (context)
4061 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004062 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004063
4064 if (fenceObject == NULL)
4065 {
4066 return GL_FALSE;
4067 }
4068
4069 return fenceObject->isFence();
4070 }
4071 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004072 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004074 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004075 }
4076
4077 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004078}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004079
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004082 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004083
4084 try
4085 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004087
4088 if (context && framebuffer)
4089 {
4090 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4091
4092 if (framebufferObject)
4093 {
4094 return GL_TRUE;
4095 }
4096 }
4097 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004098 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004100 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101 }
4102
4103 return GL_FALSE;
4104}
4105
4106GLboolean __stdcall glIsProgram(GLuint program)
4107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004108 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004109
4110 try
4111 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004112 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113
4114 if (context && program)
4115 {
4116 gl::Program *programObject = context->getProgram(program);
4117
4118 if (programObject)
4119 {
4120 return GL_TRUE;
4121 }
4122 }
4123 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004124 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004126 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127 }
4128
4129 return GL_FALSE;
4130}
4131
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004132GLboolean __stdcall glIsQueryEXT(GLuint id)
4133{
4134 EVENT("(GLuint id = %d)", id);
4135
4136 try
4137 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004138 gl::Context *context = gl::getNonLostContext();
4139
4140 if (context)
4141 {
Geoff Lang37dde692014-01-31 16:34:54 -05004142 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004143 }
4144 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004145 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004148 }
4149
4150 return GL_FALSE;
4151}
4152
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4154{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004155 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004156
4157 try
4158 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004160
4161 if (context && renderbuffer)
4162 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04004163 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164
4165 if (renderbufferObject)
4166 {
4167 return GL_TRUE;
4168 }
4169 }
4170 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004171 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174 }
4175
4176 return GL_FALSE;
4177}
4178
4179GLboolean __stdcall glIsShader(GLuint shader)
4180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004181 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182
4183 try
4184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004186
4187 if (context && shader)
4188 {
4189 gl::Shader *shaderObject = context->getShader(shader);
4190
4191 if (shaderObject)
4192 {
4193 return GL_TRUE;
4194 }
4195 }
4196 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004197 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201
4202 return GL_FALSE;
4203}
4204
4205GLboolean __stdcall glIsTexture(GLuint texture)
4206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004207 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208
4209 try
4210 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004211 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 if (context && texture)
4214 {
4215 gl::Texture *textureObject = context->getTexture(texture);
4216
4217 if (textureObject)
4218 {
4219 return GL_TRUE;
4220 }
4221 }
4222 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004223 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004225 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004226 }
4227
4228 return GL_FALSE;
4229}
4230
4231void __stdcall glLineWidth(GLfloat width)
4232{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004233 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004234
4235 try
4236 {
4237 if (width <= 0.0f)
4238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004239 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240 }
4241
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004242 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004243
4244 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004246 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247 }
4248 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004249 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004251 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 }
4253}
4254
4255void __stdcall glLinkProgram(GLuint program)
4256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004257 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258
4259 try
4260 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004262
4263 if (context)
4264 {
4265 gl::Program *programObject = context->getProgram(program);
4266
4267 if (!programObject)
4268 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004269 if (context->getShader(program))
4270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004271 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004272 }
4273 else
4274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004276 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277 }
4278
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004279 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280 }
4281 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004282 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004285 }
4286}
4287
4288void __stdcall glPixelStorei(GLenum pname, GLint param)
4289{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004290 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291
4292 try
4293 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004294 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004295
4296 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004298 switch (pname)
4299 {
4300 case GL_UNPACK_ALIGNMENT:
4301 if (param != 1 && param != 2 && param != 4 && param != 8)
4302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004304 }
4305
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004306 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004307 break;
4308
4309 case GL_PACK_ALIGNMENT:
4310 if (param != 1 && param != 2 && param != 4 && param != 8)
4311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004313 }
4314
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004315 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004316 break;
4317
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004318 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4319 context->setPackReverseRowOrder(param != 0);
4320 break;
4321
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004322 case GL_UNPACK_IMAGE_HEIGHT:
4323 case GL_UNPACK_SKIP_IMAGES:
4324 case GL_UNPACK_ROW_LENGTH:
4325 case GL_UNPACK_SKIP_ROWS:
4326 case GL_UNPACK_SKIP_PIXELS:
4327 case GL_PACK_ROW_LENGTH:
4328 case GL_PACK_SKIP_ROWS:
4329 case GL_PACK_SKIP_PIXELS:
4330 if (context->getClientVersion() < 3)
4331 {
4332 return gl::error(GL_INVALID_ENUM);
4333 }
4334 UNIMPLEMENTED();
4335 break;
4336
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004337 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004338 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004339 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340 }
4341 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004342 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004344 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345 }
4346}
4347
4348void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4349{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004350 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004351
4352 try
4353 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004355
4356 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004358 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004361 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004364 }
4365}
4366
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004367void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4368 GLenum format, GLenum type, GLsizei bufSize,
4369 GLvoid *data)
4370{
4371 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4372 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4373 x, y, width, height, format, type, bufSize, data);
4374
4375 try
4376 {
4377 if (width < 0 || height < 0 || bufSize < 0)
4378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004380 }
4381
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004382 gl::Context *context = gl::getNonLostContext();
4383
4384 if (context)
4385 {
Jamie Madill26e91952014-03-05 15:01:27 -05004386 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4387 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004388 {
Jamie Madill26e91952014-03-05 15:01:27 -05004389 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004390 }
4391
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004392 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4393 }
4394 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004395 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004398 }
4399}
4400
4401void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4402 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004403{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004404 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004405 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004406 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407
4408 try
4409 {
4410 if (width < 0 || height < 0)
4411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004412 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004413 }
4414
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004415 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416
4417 if (context)
4418 {
Jamie Madill26e91952014-03-05 15:01:27 -05004419 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4420 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004421 {
Jamie Madill26e91952014-03-05 15:01:27 -05004422 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004423 }
4424
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004425 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426 }
4427 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004428 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004431 }
4432}
4433
4434void __stdcall glReleaseShaderCompiler(void)
4435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004436 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004437
4438 try
4439 {
4440 gl::Shader::releaseCompiler();
4441 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004442 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004444 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445 }
4446}
4447
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004448void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004450 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 +00004451 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004452
4453 try
4454 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004455 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004456
4457 if (context)
4458 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004459 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004460 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004461 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004462 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004464
4465 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004466 }
4467 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004468 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 }
4472}
4473
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004474void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4475{
4476 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4477}
4478
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004479void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4480{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004481 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004482
4483 try
4484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004485 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004486
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004487 if (context)
4488 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004489 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490 }
4491 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004492 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004494 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495 }
4496}
4497
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004498void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4499{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004500 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004501
4502 try
4503 {
4504 if (condition != GL_ALL_COMPLETED_NV)
4505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004506 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004507 }
4508
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004509 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004510
4511 if (context)
4512 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004513 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004514
4515 if (fenceObject == NULL)
4516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004517 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004518 }
4519
4520 fenceObject->setFence(condition);
4521 }
4522 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004523 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004525 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004526 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004527}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004528
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004531 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 +00004532
4533 try
4534 {
4535 if (width < 0 || height < 0)
4536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004537 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538 }
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.com428d1582010-05-04 03:35:25 +00004544 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004547 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004548 {
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.comfe4b8272010-04-08 03:51:20 +00004553void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004555 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004556 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004557 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558
4559 try
4560 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004561 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004562 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004564 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004567 }
4568}
4569
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004570void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004572 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 +00004573 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574
4575 try
4576 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004577 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004579 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004580 }
4581
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004583
4584 if (context)
4585 {
4586 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004587
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004588 if (!shaderObject)
4589 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004590 if (context->getProgram(shader))
4591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004593 }
4594 else
4595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004597 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004598 }
4599
4600 shaderObject->setSource(count, string, length);
4601 }
4602 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004603 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004605 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606 }
4607}
4608
4609void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4610{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004611 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004612}
4613
4614void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4615{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004616 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 +00004617
4618 try
4619 {
4620 switch (face)
4621 {
4622 case GL_FRONT:
4623 case GL_BACK:
4624 case GL_FRONT_AND_BACK:
4625 break;
4626 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629
4630 switch (func)
4631 {
4632 case GL_NEVER:
4633 case GL_ALWAYS:
4634 case GL_LESS:
4635 case GL_LEQUAL:
4636 case GL_EQUAL:
4637 case GL_GEQUAL:
4638 case GL_GREATER:
4639 case GL_NOTEQUAL:
4640 break;
4641 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 }
4644
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004645 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004646
4647 if (context)
4648 {
4649 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4650 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004651 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652 }
4653
4654 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4655 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004656 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657 }
4658 }
4659 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004660 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004663 }
4664}
4665
4666void __stdcall glStencilMask(GLuint mask)
4667{
4668 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4669}
4670
4671void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4672{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004673 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674
4675 try
4676 {
4677 switch (face)
4678 {
4679 case GL_FRONT:
4680 case GL_BACK:
4681 case GL_FRONT_AND_BACK:
4682 break;
4683 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004685 }
4686
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004687 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688
4689 if (context)
4690 {
4691 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4692 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004693 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004694 }
4695
4696 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4697 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004698 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699 }
4700 }
4701 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004702 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705 }
4706}
4707
4708void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4709{
4710 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4711}
4712
4713void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004715 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 +00004716 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717
4718 try
4719 {
4720 switch (face)
4721 {
4722 case GL_FRONT:
4723 case GL_BACK:
4724 case GL_FRONT_AND_BACK:
4725 break;
4726 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004727 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728 }
4729
4730 switch (fail)
4731 {
4732 case GL_ZERO:
4733 case GL_KEEP:
4734 case GL_REPLACE:
4735 case GL_INCR:
4736 case GL_DECR:
4737 case GL_INVERT:
4738 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004739 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004740 break;
4741 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743 }
4744
4745 switch (zfail)
4746 {
4747 case GL_ZERO:
4748 case GL_KEEP:
4749 case GL_REPLACE:
4750 case GL_INCR:
4751 case GL_DECR:
4752 case GL_INVERT:
4753 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004754 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755 break;
4756 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004757 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004758 }
4759
4760 switch (zpass)
4761 {
4762 case GL_ZERO:
4763 case GL_KEEP:
4764 case GL_REPLACE:
4765 case GL_INCR:
4766 case GL_DECR:
4767 case GL_INVERT:
4768 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004769 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770 break;
4771 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773 }
4774
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004775 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776
4777 if (context)
4778 {
4779 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4780 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004781 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783
4784 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4785 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004786 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787 }
4788 }
4789 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004790 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793 }
4794}
4795
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004796GLboolean __stdcall glTestFenceNV(GLuint fence)
4797{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004798 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004799
4800 try
4801 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004802 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004803
4804 if (context)
4805 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004806 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004807
4808 if (fenceObject == NULL)
4809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004810 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004811 }
4812
Jamie Madillfb9a7402013-07-26 11:55:01 -04004813 if (fenceObject->isFence() != GL_TRUE)
4814 {
4815 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4816 }
4817
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004818 return fenceObject->testFence();
4819 }
4820 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004821 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004823 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004824 }
4825
4826 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004827}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004828
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004829void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4830 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004832 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004833 "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 +00004834 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835
4836 try
4837 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839
4840 if (context)
4841 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004842 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004843 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004844 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004845 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004846 return;
4847 }
4848
4849 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004850 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004851 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004852 {
4853 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004854 }
4855
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004856 switch (target)
4857 {
4858 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004859 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004860 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004861 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004862 }
4863 break;
4864 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004865 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004866 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004867 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004869 break;
4870 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4871 {
4872 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004873 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004874 }
4875 break;
4876 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4877 {
4878 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004879 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004880 }
4881 break;
4882 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4883 {
4884 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004885 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004886 }
4887 break;
4888 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4889 {
4890 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004891 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004892 }
4893 break;
4894 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4895 {
4896 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004897 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004898 }
4899 break;
4900 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004901 }
4902 }
4903 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004904 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004906 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907 }
4908}
4909
4910void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4911{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004912 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4913
4914 try
4915 {
4916 gl::Context *context = gl::getNonLostContext();
4917
4918 if (context)
4919 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004920 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004921 {
4922 return;
4923 }
4924
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004925 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004926
Jamie Madillfb8a8302013-07-03 14:24:12 -04004927 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004929 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004930 }
4931
4932 switch (pname)
4933 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004934 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4935 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4936 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4937 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4938 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4939 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langcec35902014-04-16 10:52:36 -04004940 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004941 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4942 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004943 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4944 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4945 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4946 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004947 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
4948 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
4949 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
4950 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004951 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004952 }
4953 }
4954 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004955 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004957 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004958 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004959}
4960
4961void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4962{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004963 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004964}
4965
4966void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4967{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004968 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004969
4970 try
4971 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004972 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004973
4974 if (context)
4975 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004976 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004977 {
4978 return;
4979 }
4980
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004981 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982
Jamie Madillfb8a8302013-07-03 14:24:12 -04004983 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004985 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986 }
4987
4988 switch (pname)
4989 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004990 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
4991 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
4992 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
4993 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
4994 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
4995 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langcec35902014-04-16 10:52:36 -04004996 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004997 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
4998 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004999 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5000 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5001 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5002 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005003 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5004 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5005 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5006 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005007 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008 }
5009 }
5010 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005011 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005013 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014 }
5015}
5016
5017void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5018{
5019 glTexParameteri(target, pname, *params);
5020}
5021
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005022void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5023{
5024 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5025 target, levels, internalformat, width, height);
5026
5027 try
5028 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005029 gl::Context *context = gl::getNonLostContext();
5030
5031 if (context)
5032 {
Geoff Langcec35902014-04-16 10:52:36 -04005033 if (!context->getCaps().extensions.textureStorage)
5034 {
5035 return gl::error(GL_INVALID_OPERATION);
5036 }
5037
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005038 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005039 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005040 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005041 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005042 }
5043
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005044 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005045 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005046 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005047 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005048 }
5049
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005050 switch (target)
5051 {
5052 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005053 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005054 gl::Texture2D *texture2d = context->getTexture2D();
5055 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005056 }
5057 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005058
Geoff Lang01c21d22013-09-24 11:52:16 -04005059 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005060 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005061 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5062 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005063 }
5064 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005065
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005066 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005068 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005069 }
5070 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005071 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005074 }
5075}
5076
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005077void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5078 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005080 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005081 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005082 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005083 target, level, xoffset, yoffset, width, height, format, type, pixels);
5084
5085 try
5086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005088
5089 if (context)
5090 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005091 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005092 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005093 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005094 {
5095 return;
5096 }
5097
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005098 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005099 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005100 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005101 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005102 return;
5103 }
5104
Geoff Langc41e42d2014-04-28 10:58:16 -04005105 // Zero sized uploads are valid but no-ops
5106 if (width == 0 || height == 0)
5107 {
5108 return;
5109 }
5110
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005111 switch (target)
5112 {
5113 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005114 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005115 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005116 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005117 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005118 break;
5119
5120 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5121 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5122 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5123 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5124 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5125 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005126 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005127 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005128 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005129 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005130 break;
5131
5132 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005133 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005134 }
5135 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005136 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005137 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005139 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005140 }
5141}
5142
5143void __stdcall glUniform1f(GLint location, GLfloat x)
5144{
5145 glUniform1fv(location, 1, &x);
5146}
5147
5148void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005150 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151
5152 try
5153 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005154 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005155
5156 if (context)
5157 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005158 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005159 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005160 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005161 }
5162
Jamie Madillaa981bd2014-05-20 10:55:55 -04005163 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005164 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 }
5166 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005167 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170 }
5171}
5172
5173void __stdcall glUniform1i(GLint location, GLint x)
5174{
5175 glUniform1iv(location, 1, &x);
5176}
5177
5178void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005180 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005181
5182 try
5183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005185
5186 if (context)
5187 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005188 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005189 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005190 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005191 }
5192
Jamie Madillaa981bd2014-05-20 10:55:55 -04005193 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005194 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005195 }
5196 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005197 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200 }
5201}
5202
5203void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5204{
5205 GLfloat xy[2] = {x, y};
5206
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005207 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208}
5209
5210void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5211{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005212 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005213
5214 try
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 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005220 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005221 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005222 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005223 }
5224
Jamie Madillaa981bd2014-05-20 10:55:55 -04005225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005226 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 }
5228 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005229 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005231 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005232 }
5233}
5234
5235void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5236{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005237 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005238
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005239 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005240}
5241
5242void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005244 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245
5246 try
5247 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005248 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005249
5250 if (context)
5251 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005252 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005253 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005254 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005255 }
5256
Jamie Madillaa981bd2014-05-20 10:55:55 -04005257 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005258 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005259 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005261 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005264 }
5265}
5266
5267void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5268{
5269 GLfloat xyz[3] = {x, y, z};
5270
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005271 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272}
5273
5274void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5275{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005276 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277
5278 try
5279 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281
5282 if (context)
5283 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005284 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005285 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005286 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005287 }
5288
Jamie Madillaa981bd2014-05-20 10:55:55 -04005289 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005290 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 }
5292 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005293 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005295 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 }
5297}
5298
5299void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5300{
5301 GLint xyz[3] = {x, y, z};
5302
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005303 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304}
5305
5306void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005308 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005309
5310 try
5311 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005313
5314 if (context)
5315 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005316 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005317 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005318 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005319 }
5320
Jamie Madillaa981bd2014-05-20 10:55:55 -04005321 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005322 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005323 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005325 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005327 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005328 }
5329}
5330
5331void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5332{
5333 GLfloat xyzw[4] = {x, y, z, w};
5334
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005335 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336}
5337
5338void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005340 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341
5342 try
5343 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005344 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005345
5346 if (context)
5347 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005348 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005349 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005350 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005351 }
5352
Jamie Madillaa981bd2014-05-20 10:55:55 -04005353 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005354 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355 }
5356 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005357 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005359 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 }
5361}
5362
5363void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5364{
5365 GLint xyzw[4] = {x, y, z, w};
5366
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005367 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368}
5369
5370void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005372 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005373
5374 try
5375 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005376 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005377
5378 if (context)
5379 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005380 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005381 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005382 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005383 }
5384
Jamie Madillaa981bd2014-05-20 10:55:55 -04005385 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005386 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005387 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005389 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005391 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005392 }
5393}
5394
5395void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5396{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005397 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005398 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005399
5400 try
5401 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 if (context)
5405 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005406 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005407 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005408 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005409 }
5410
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005411 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005412 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413 }
5414 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005415 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005417 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005418 }
5419}
5420
5421void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5422{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005423 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005424 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425
5426 try
5427 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005428 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429
5430 if (context)
5431 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005432 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005433 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005434 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005435 }
5436
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005437 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005438 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005441 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444 }
5445}
5446
5447void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5448{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005449 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005450 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451
5452 try
5453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455
5456 if (context)
5457 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005458 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005459 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005460 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005461 }
5462
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005463 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005464 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465 }
5466 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005467 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 }
5471}
5472
5473void __stdcall glUseProgram(GLuint program)
5474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005475 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476
5477 try
5478 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005480
5481 if (context)
5482 {
5483 gl::Program *programObject = context->getProgram(program);
5484
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005485 if (!programObject && program != 0)
5486 {
5487 if (context->getShader(program))
5488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005490 }
5491 else
5492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005494 }
5495 }
5496
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005497 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005500 }
5501
5502 context->useProgram(program);
5503 }
5504 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005505 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005508 }
5509}
5510
5511void __stdcall glValidateProgram(GLuint program)
5512{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005513 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514
5515 try
5516 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005517 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005518
5519 if (context)
5520 {
5521 gl::Program *programObject = context->getProgram(program);
5522
5523 if (!programObject)
5524 {
5525 if (context->getShader(program))
5526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005527 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005528 }
5529 else
5530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005532 }
5533 }
5534
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005535 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005536 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005538 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005540 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541 }
5542}
5543
5544void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5545{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005546 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547
5548 try
5549 {
5550 if (index >= gl::MAX_VERTEX_ATTRIBS)
5551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005552 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005553 }
5554
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005555 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005556
5557 if (context)
5558 {
5559 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005560 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005561 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005562 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005563 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005566 }
5567}
5568
5569void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5570{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005571 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572
5573 try
5574 {
5575 if (index >= gl::MAX_VERTEX_ATTRIBS)
5576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578 }
5579
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005580 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005581
5582 if (context)
5583 {
5584 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005585 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005586 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005587 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005588 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005590 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005591 }
5592}
5593
5594void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005596 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597
5598 try
5599 {
5600 if (index >= gl::MAX_VERTEX_ATTRIBS)
5601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005602 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603 }
5604
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005606
5607 if (context)
5608 {
5609 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005610 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005611 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005612 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005613 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005615 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616 }
5617}
5618
5619void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5620{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005621 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005622
5623 try
5624 {
5625 if (index >= gl::MAX_VERTEX_ATTRIBS)
5626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005627 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628 }
5629
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005630 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005631
5632 if (context)
5633 {
5634 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005635 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005636 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005638 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005641 }
5642}
5643
5644void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005646 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 +00005647
5648 try
5649 {
5650 if (index >= gl::MAX_VERTEX_ATTRIBS)
5651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 }
5654
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005656
5657 if (context)
5658 {
5659 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005660 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005661 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005662 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005663 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005665 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005666 }
5667}
5668
5669void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005671 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672
5673 try
5674 {
5675 if (index >= gl::MAX_VERTEX_ATTRIBS)
5676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005678 }
5679
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005680 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005681
5682 if (context)
5683 {
5684 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005685 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005686 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005687 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005688 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005690 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005691 }
5692}
5693
5694void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5695{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005696 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 +00005697
5698 try
5699 {
5700 if (index >= gl::MAX_VERTEX_ATTRIBS)
5701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005702 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005703 }
5704
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005705 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005706
5707 if (context)
5708 {
5709 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005710 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005711 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005713 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005715 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716 }
5717}
5718
5719void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5720{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005721 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722
5723 try
5724 {
5725 if (index >= gl::MAX_VERTEX_ATTRIBS)
5726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005731
5732 if (context)
5733 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005734 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005735 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005737 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740 }
5741}
5742
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005743void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5744{
5745 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5746
5747 try
5748 {
5749 if (index >= gl::MAX_VERTEX_ATTRIBS)
5750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005752 }
5753
5754 gl::Context *context = gl::getNonLostContext();
5755
5756 if (context)
5757 {
5758 context->setVertexAttribDivisor(index, divisor);
5759 }
5760 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005761 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005764 }
5765}
5766
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005767void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005769 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005770 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005771 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772
5773 try
5774 {
5775 if (index >= gl::MAX_VERTEX_ATTRIBS)
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778 }
5779
5780 if (size < 1 || size > 4)
5781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005782 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005783 }
5784
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005785 gl::Context *context = gl::getNonLostContext();
5786
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 switch (type)
5788 {
5789 case GL_BYTE:
5790 case GL_UNSIGNED_BYTE:
5791 case GL_SHORT:
5792 case GL_UNSIGNED_SHORT:
5793 case GL_FIXED:
5794 case GL_FLOAT:
5795 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005796 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005797 case GL_INT:
5798 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005799 case GL_INT_2_10_10_10_REV:
5800 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005801 if (context && context->getClientVersion() < 3)
5802 {
5803 return gl::error(GL_INVALID_ENUM);
5804 }
5805 else
5806 {
5807 break;
5808 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005810 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005811 }
5812
5813 if (stride < 0)
5814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 }
5817
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005818 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5819 {
5820 return gl::error(GL_INVALID_OPERATION);
5821 }
5822
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005823 if (context)
5824 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005825 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5826 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5827 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5828 // and the pointer argument is not NULL.
5829 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5830 {
5831 return gl::error(GL_INVALID_OPERATION);
5832 }
5833
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005834 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5835 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836 }
5837 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005838 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841 }
5842}
5843
5844void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005846 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 +00005847
5848 try
5849 {
5850 if (width < 0 || height < 0)
5851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005852 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853 }
5854
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856
5857 if (context)
5858 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005859 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 }
5861 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005862 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005864 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005865 }
5866}
5867
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005868// OpenGL ES 3.0 functions
5869
5870void __stdcall glReadBuffer(GLenum mode)
5871{
5872 EVENT("(GLenum mode = 0x%X)", mode);
5873
5874 try
5875 {
5876 gl::Context *context = gl::getNonLostContext();
5877
5878 if (context)
5879 {
5880 if (context->getClientVersion() < 3)
5881 {
5882 return gl::error(GL_INVALID_OPERATION);
5883 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005884
Jamie Madill54133512013-06-21 09:33:07 -04005885 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005886 UNIMPLEMENTED();
5887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005888 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005889 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005890 {
5891 return gl::error(GL_OUT_OF_MEMORY);
5892 }
5893}
5894
5895void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5896{
5897 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5898 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5899
5900 try
5901 {
5902 gl::Context *context = gl::getNonLostContext();
5903
5904 if (context)
5905 {
5906 if (context->getClientVersion() < 3)
5907 {
5908 return gl::error(GL_INVALID_OPERATION);
5909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005910
Jamie Madill54133512013-06-21 09:33:07 -04005911 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005912 UNIMPLEMENTED();
5913 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005914 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005915 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005916 {
5917 return gl::error(GL_OUT_OF_MEMORY);
5918 }
5919}
5920
5921void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5922{
5923 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5924 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5925 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5926 target, level, internalformat, width, height, depth, border, format, type, pixels);
5927
5928 try
5929 {
5930 gl::Context *context = gl::getNonLostContext();
5931
5932 if (context)
5933 {
5934 if (context->getClientVersion() < 3)
5935 {
5936 return gl::error(GL_INVALID_OPERATION);
5937 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005938
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005939 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005940 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005941 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005942 {
5943 return;
5944 }
5945
5946 switch(target)
5947 {
5948 case GL_TEXTURE_3D:
5949 {
5950 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005951 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005952 }
5953 break;
5954
5955 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005956 {
5957 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005958 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005959 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005960 break;
5961
5962 default:
5963 return gl::error(GL_INVALID_ENUM);
5964 }
5965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005966 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005967 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005968 {
5969 return gl::error(GL_OUT_OF_MEMORY);
5970 }
5971}
5972
5973void __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)
5974{
5975 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5976 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5977 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5978 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5979
5980 try
5981 {
5982 gl::Context *context = gl::getNonLostContext();
5983
5984 if (context)
5985 {
5986 if (context->getClientVersion() < 3)
5987 {
5988 return gl::error(GL_INVALID_OPERATION);
5989 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005990
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005991 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005992 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005993 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005994 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005995 {
5996 return;
5997 }
5998
Geoff Langc41e42d2014-04-28 10:58:16 -04005999 // Zero sized uploads are valid but no-ops
6000 if (width == 0 || height == 0 || depth == 0)
6001 {
6002 return;
6003 }
6004
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006005 switch(target)
6006 {
6007 case GL_TEXTURE_3D:
6008 {
6009 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006010 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 +00006011 }
6012 break;
6013
6014 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006015 {
6016 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006017 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 +00006018 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006019 break;
6020
6021 default:
6022 return gl::error(GL_INVALID_ENUM);
6023 }
6024 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006025 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006026 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006027 {
6028 return gl::error(GL_OUT_OF_MEMORY);
6029 }
6030}
6031
6032void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6033{
6034 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6035 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6036 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6037
6038 try
6039 {
6040 gl::Context *context = gl::getNonLostContext();
6041
6042 if (context)
6043 {
6044 if (context->getClientVersion() < 3)
6045 {
6046 return gl::error(GL_INVALID_OPERATION);
6047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006048
Jamie Madill6f38f822014-06-06 17:12:20 -04006049 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006050 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006051 {
6052 return;
6053 }
6054
6055 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6056 gl::Texture *texture = NULL;
6057 switch (target)
6058 {
6059 case GL_TEXTURE_3D:
6060 texture = context->getTexture3D();
6061 break;
6062
6063 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006064 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006065 break;
6066
6067 default:
6068 return gl::error(GL_INVALID_ENUM);
6069 }
6070
6071 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6072 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006073 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006074 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006075 {
6076 return gl::error(GL_OUT_OF_MEMORY);
6077 }
6078}
6079
6080void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6081{
Geoff Langeef52cc2013-10-16 15:07:39 -04006082 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 +00006083 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6084 "const GLvoid* data = 0x%0.8p)",
6085 target, level, internalformat, width, height, depth, border, imageSize, data);
6086
6087 try
6088 {
6089 gl::Context *context = gl::getNonLostContext();
6090
6091 if (context)
6092 {
6093 if (context->getClientVersion() < 3)
6094 {
6095 return gl::error(GL_INVALID_OPERATION);
6096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006097
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006098 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 +00006099 {
6100 return gl::error(GL_INVALID_VALUE);
6101 }
6102
6103 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006104 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006105 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006106 {
6107 return;
6108 }
6109
6110 switch(target)
6111 {
6112 case GL_TEXTURE_3D:
6113 {
6114 gl::Texture3D *texture = context->getTexture3D();
6115 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6116 }
6117 break;
6118
6119 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006120 {
6121 gl::Texture2DArray *texture = context->getTexture2DArray();
6122 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6123 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006124 break;
6125
6126 default:
6127 return gl::error(GL_INVALID_ENUM);
6128 }
6129 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006130 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006131 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006132 {
6133 return gl::error(GL_OUT_OF_MEMORY);
6134 }
6135}
6136
6137void __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)
6138{
6139 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6140 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6141 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6142 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6143
6144 try
6145 {
6146 gl::Context *context = gl::getNonLostContext();
6147
6148 if (context)
6149 {
6150 if (context->getClientVersion() < 3)
6151 {
6152 return gl::error(GL_INVALID_OPERATION);
6153 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006154
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006155 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 +00006156 {
6157 return gl::error(GL_INVALID_VALUE);
6158 }
6159
6160 if (!data)
6161 {
6162 return gl::error(GL_INVALID_VALUE);
6163 }
6164
6165 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006166 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006167 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006168 {
6169 return;
6170 }
6171
Geoff Langc41e42d2014-04-28 10:58:16 -04006172 // Zero sized uploads are valid but no-ops
6173 if (width == 0 || height == 0)
6174 {
6175 return;
6176 }
6177
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006178 switch(target)
6179 {
6180 case GL_TEXTURE_3D:
6181 {
6182 gl::Texture3D *texture = context->getTexture3D();
6183 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6184 format, imageSize, data);
6185 }
6186 break;
6187
6188 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006189 {
6190 gl::Texture2DArray *texture = context->getTexture2DArray();
6191 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6192 format, imageSize, data);
6193 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006194 break;
6195
6196 default:
6197 return gl::error(GL_INVALID_ENUM);
6198 }
6199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006200 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006201 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006202 {
6203 return gl::error(GL_OUT_OF_MEMORY);
6204 }
6205}
6206
6207void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6208{
6209 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6210
6211 try
6212 {
6213 gl::Context *context = gl::getNonLostContext();
6214
6215 if (context)
6216 {
6217 if (context->getClientVersion() < 3)
6218 {
6219 return gl::error(GL_INVALID_OPERATION);
6220 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006221
Geoff Lang37dde692014-01-31 16:34:54 -05006222 if (n < 0)
6223 {
6224 return gl::error(GL_INVALID_VALUE);
6225 }
6226
6227 for (GLsizei i = 0; i < n; i++)
6228 {
6229 ids[i] = context->createQuery();
6230 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006231 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006232 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006233 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006234 {
6235 return gl::error(GL_OUT_OF_MEMORY);
6236 }
6237}
6238
6239void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6240{
6241 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6242
6243 try
6244 {
6245 gl::Context *context = gl::getNonLostContext();
6246
6247 if (context)
6248 {
6249 if (context->getClientVersion() < 3)
6250 {
6251 return gl::error(GL_INVALID_OPERATION);
6252 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006253
Geoff Lang37dde692014-01-31 16:34:54 -05006254 if (n < 0)
6255 {
6256 return gl::error(GL_INVALID_VALUE);
6257 }
6258
6259 for (GLsizei i = 0; i < n; i++)
6260 {
6261 context->deleteQuery(ids[i]);
6262 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006264 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006265 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006266 {
6267 return gl::error(GL_OUT_OF_MEMORY);
6268 }
6269}
6270
6271GLboolean __stdcall glIsQuery(GLuint id)
6272{
6273 EVENT("(GLuint id = %u)", id);
6274
6275 try
6276 {
6277 gl::Context *context = gl::getNonLostContext();
6278
6279 if (context)
6280 {
6281 if (context->getClientVersion() < 3)
6282 {
6283 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006285
Geoff Lang37dde692014-01-31 16:34:54 -05006286 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006288 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006289 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006290 {
6291 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6292 }
6293
6294 return GL_FALSE;
6295}
6296
6297void __stdcall glBeginQuery(GLenum target, GLuint id)
6298{
6299 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6300
6301 try
6302 {
6303 gl::Context *context = gl::getNonLostContext();
6304
6305 if (context)
6306 {
6307 if (context->getClientVersion() < 3)
6308 {
6309 return gl::error(GL_INVALID_OPERATION);
6310 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006311
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006312 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006313 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006314 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006315 }
Geoff Lang37dde692014-01-31 16:34:54 -05006316 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006317 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006318 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006319 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006320 {
6321 return gl::error(GL_OUT_OF_MEMORY);
6322 }
6323}
6324
6325void __stdcall glEndQuery(GLenum target)
6326{
6327 EVENT("(GLenum target = 0x%X)", target);
6328
6329 try
6330 {
6331 gl::Context *context = gl::getNonLostContext();
6332
6333 if (context)
6334 {
6335 if (context->getClientVersion() < 3)
6336 {
6337 return gl::error(GL_INVALID_OPERATION);
6338 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006339
Jamie Madill45c785d2014-05-13 14:09:34 -04006340 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006341 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006342 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006343 }
Geoff Lang37dde692014-01-31 16:34:54 -05006344
6345 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006346 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006347 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006348 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006349 {
6350 return gl::error(GL_OUT_OF_MEMORY);
6351 }
6352}
6353
6354void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6355{
6356 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6357
6358 try
6359 {
6360 gl::Context *context = gl::getNonLostContext();
6361
6362 if (context)
6363 {
6364 if (context->getClientVersion() < 3)
6365 {
6366 return gl::error(GL_INVALID_OPERATION);
6367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006368
Geoff Lang37dde692014-01-31 16:34:54 -05006369 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006370 {
Geoff Lang37dde692014-01-31 16:34:54 -05006371 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006372 }
Geoff Lang37dde692014-01-31 16:34:54 -05006373
6374 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006375 {
Geoff Lang37dde692014-01-31 16:34:54 -05006376 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006377 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006378 break;
6379
6380 default:
6381 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006382 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006383 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006384 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006385 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006386 {
6387 return gl::error(GL_OUT_OF_MEMORY);
6388 }
6389}
6390
6391void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6392{
6393 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6394
6395 try
6396 {
6397 gl::Context *context = gl::getNonLostContext();
6398
6399 if (context)
6400 {
6401 if (context->getClientVersion() < 3)
6402 {
6403 return gl::error(GL_INVALID_OPERATION);
6404 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006405
Geoff Lang37dde692014-01-31 16:34:54 -05006406 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6407
6408 if (!queryObject)
6409 {
6410 return gl::error(GL_INVALID_OPERATION);
6411 }
6412
Jamie Madill45c785d2014-05-13 14:09:34 -04006413 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006414 {
6415 return gl::error(GL_INVALID_OPERATION);
6416 }
6417
6418 switch(pname)
6419 {
6420 case GL_QUERY_RESULT:
6421 params[0] = queryObject->getResult();
6422 break;
6423 case GL_QUERY_RESULT_AVAILABLE:
6424 params[0] = queryObject->isResultAvailable();
6425 break;
6426 default:
6427 return gl::error(GL_INVALID_ENUM);
6428 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006430 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006431 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006432 {
6433 return gl::error(GL_OUT_OF_MEMORY);
6434 }
6435}
6436
6437GLboolean __stdcall glUnmapBuffer(GLenum target)
6438{
6439 EVENT("(GLenum target = 0x%X)", target);
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, GL_FALSE);
6450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006451
Shannon Woodsb3801742014-03-27 14:59:19 -04006452 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006454 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006455 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006456 {
6457 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6458 }
6459
6460 return GL_FALSE;
6461}
6462
6463void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6464{
6465 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6466
6467 try
6468 {
6469 gl::Context *context = gl::getNonLostContext();
6470
6471 if (context)
6472 {
6473 if (context->getClientVersion() < 3)
6474 {
6475 return gl::error(GL_INVALID_OPERATION);
6476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006477
Shannon Woodsb3801742014-03-27 14:59:19 -04006478 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006481 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006482 {
6483 return gl::error(GL_OUT_OF_MEMORY);
6484 }
6485}
6486
6487void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6488{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006489 try
6490 {
6491 gl::Context *context = gl::getNonLostContext();
6492
6493 if (context)
6494 {
6495 if (context->getClientVersion() < 3)
6496 {
6497 return gl::error(GL_INVALID_OPERATION);
6498 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006499
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006500 glDrawBuffersEXT(n, bufs);
6501 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006502 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006503 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006504 {
6505 return gl::error(GL_OUT_OF_MEMORY);
6506 }
6507}
6508
6509void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6510{
6511 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6512 location, count, transpose, value);
6513
6514 try
6515 {
6516 gl::Context *context = gl::getNonLostContext();
6517
6518 if (context)
6519 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006520 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006521 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006522 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006523 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006524
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006525 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006526 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006529 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006530 {
6531 return gl::error(GL_OUT_OF_MEMORY);
6532 }
6533}
6534
6535void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6536{
6537 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6538 location, count, transpose, value);
6539
6540 try
6541 {
6542 gl::Context *context = gl::getNonLostContext();
6543
6544 if (context)
6545 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006546 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006547 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006548 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006550
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006551 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006552 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006554 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006555 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006556 {
6557 return gl::error(GL_OUT_OF_MEMORY);
6558 }
6559}
6560
6561void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6562{
6563 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6564 location, count, transpose, value);
6565
6566 try
6567 {
6568 gl::Context *context = gl::getNonLostContext();
6569
6570 if (context)
6571 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006572 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006573 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006574 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006576
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006577 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006578 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006581 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006582 {
6583 return gl::error(GL_OUT_OF_MEMORY);
6584 }
6585}
6586
6587void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6588{
6589 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6590 location, count, transpose, value);
6591
6592 try
6593 {
6594 gl::Context *context = gl::getNonLostContext();
6595
6596 if (context)
6597 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006598 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006599 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006600 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006601 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006602
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006603 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006604 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006606 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006607 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006608 {
6609 return gl::error(GL_OUT_OF_MEMORY);
6610 }
6611}
6612
6613void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6614{
6615 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6616 location, count, transpose, value);
6617
6618 try
6619 {
6620 gl::Context *context = gl::getNonLostContext();
6621
6622 if (context)
6623 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006624 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006625 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006626 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006628
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006629 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006630 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006632 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006633 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006634 {
6635 return gl::error(GL_OUT_OF_MEMORY);
6636 }
6637}
6638
6639void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6640{
6641 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6642 location, count, transpose, value);
6643
6644 try
6645 {
6646 gl::Context *context = gl::getNonLostContext();
6647
6648 if (context)
6649 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006650 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006651 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006652 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006654
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006655 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006656 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006658 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006659 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006660 {
6661 return gl::error(GL_OUT_OF_MEMORY);
6662 }
6663}
6664
6665void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6666{
6667 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6668 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6669 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6670
6671 try
6672 {
6673 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006674 if (context)
6675 {
6676 if (context->getClientVersion() < 3)
6677 {
6678 return gl::error(GL_INVALID_OPERATION);
6679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006680
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006681 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006682 dstX0, dstY0, dstX1, dstY1, mask, filter,
6683 false))
6684 {
6685 return;
6686 }
6687
6688 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6689 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006691 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006692 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006693 {
6694 return gl::error(GL_OUT_OF_MEMORY);
6695 }
6696}
6697
6698void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6699{
6700 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6701 target, samples, internalformat, width, height);
6702
6703 try
6704 {
6705 gl::Context *context = gl::getNonLostContext();
6706
6707 if (context)
6708 {
6709 if (context->getClientVersion() < 3)
6710 {
6711 return gl::error(GL_INVALID_OPERATION);
6712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006713
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006714 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006715 width, height, false))
6716 {
6717 return;
6718 }
6719
6720 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006721 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006722 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006723 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006724 {
6725 return gl::error(GL_OUT_OF_MEMORY);
6726 }
6727}
6728
6729void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6730{
6731 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6732 target, attachment, texture, level, layer);
6733
6734 try
6735 {
6736 gl::Context *context = gl::getNonLostContext();
6737
6738 if (context)
6739 {
6740 if (context->getClientVersion() < 3)
6741 {
6742 return gl::error(GL_INVALID_OPERATION);
6743 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006744
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006745 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006746 {
6747 return;
6748 }
6749
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006750 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6751 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006752
6753 gl::Texture *textureObject = context->getTexture(texture);
6754 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6755
6756 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6757 {
6758 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6759 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6760 }
6761 else
6762 {
6763 switch (attachment)
6764 {
6765 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6766 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6767 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6768 }
6769 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006771 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006772 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006773 {
6774 return gl::error(GL_OUT_OF_MEMORY);
6775 }
6776}
6777
6778GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6779{
6780 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6781 target, offset, length, access);
6782
6783 try
6784 {
6785 gl::Context *context = gl::getNonLostContext();
6786
6787 if (context)
6788 {
6789 if (context->getClientVersion() < 3)
6790 {
6791 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6792 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006793
Shannon Woods916e7692014-03-27 16:58:22 -04006794 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006796 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006797 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006798 {
6799 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6800 }
6801
6802 return NULL;
6803}
6804
6805void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6806{
6807 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6808
6809 try
6810 {
6811 gl::Context *context = gl::getNonLostContext();
6812
6813 if (context)
6814 {
6815 if (context->getClientVersion() < 3)
6816 {
6817 return gl::error(GL_INVALID_OPERATION);
6818 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006819
Shannon Woods916e7692014-03-27 16:58:22 -04006820 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006822 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006823 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006824 {
6825 return gl::error(GL_OUT_OF_MEMORY);
6826 }
6827}
6828
6829void __stdcall glBindVertexArray(GLuint array)
6830{
6831 EVENT("(GLuint array = %u)", array);
6832
6833 try
6834 {
6835 gl::Context *context = gl::getNonLostContext();
6836
6837 if (context)
6838 {
6839 if (context->getClientVersion() < 3)
6840 {
6841 return gl::error(GL_INVALID_OPERATION);
6842 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006843
Jamie Madilld1028542013-07-02 11:57:04 -04006844 gl::VertexArray *vao = context->getVertexArray(array);
6845
6846 if (!vao)
6847 {
6848 // The default VAO should always exist
6849 ASSERT(array != 0);
6850 return gl::error(GL_INVALID_OPERATION);
6851 }
6852
6853 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006854 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006855 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006856 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006857 {
6858 return gl::error(GL_OUT_OF_MEMORY);
6859 }
6860}
6861
6862void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6863{
6864 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6865
6866 try
6867 {
6868 gl::Context *context = gl::getNonLostContext();
6869
6870 if (context)
6871 {
6872 if (context->getClientVersion() < 3)
6873 {
6874 return gl::error(GL_INVALID_OPERATION);
6875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006876
Jamie Madilld1028542013-07-02 11:57:04 -04006877 if (n < 0)
6878 {
6879 return gl::error(GL_INVALID_VALUE);
6880 }
6881
6882 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6883 {
6884 if (arrays[arrayIndex] != 0)
6885 {
6886 context->deleteVertexArray(arrays[arrayIndex]);
6887 }
6888 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006890 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006891 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006892 {
6893 return gl::error(GL_OUT_OF_MEMORY);
6894 }
6895}
6896
6897void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6898{
6899 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6900
6901 try
6902 {
6903 gl::Context *context = gl::getNonLostContext();
6904
6905 if (context)
6906 {
6907 if (context->getClientVersion() < 3)
6908 {
6909 return gl::error(GL_INVALID_OPERATION);
6910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006911
Jamie Madilld1028542013-07-02 11:57:04 -04006912 if (n < 0)
6913 {
6914 return gl::error(GL_INVALID_VALUE);
6915 }
6916
6917 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6918 {
6919 arrays[arrayIndex] = context->createVertexArray();
6920 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006922 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006923 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006924 {
6925 return gl::error(GL_OUT_OF_MEMORY);
6926 }
6927}
6928
6929GLboolean __stdcall glIsVertexArray(GLuint array)
6930{
6931 EVENT("(GLuint array = %u)", array);
6932
6933 try
6934 {
6935 gl::Context *context = gl::getNonLostContext();
6936
6937 if (context)
6938 {
6939 if (context->getClientVersion() < 3)
6940 {
6941 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6942 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006943
Jamie Madilld1028542013-07-02 11:57:04 -04006944 if (array == 0)
6945 {
6946 return GL_FALSE;
6947 }
6948
6949 gl::VertexArray *vao = context->getVertexArray(array);
6950
6951 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006952 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006953 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006954 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006955 {
6956 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6957 }
6958
6959 return GL_FALSE;
6960}
6961
6962void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
6963{
6964 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
6965 target, index, data);
6966
6967 try
6968 {
6969 gl::Context *context = gl::getNonLostContext();
6970
6971 if (context)
6972 {
6973 if (context->getClientVersion() < 3)
6974 {
6975 return gl::error(GL_INVALID_OPERATION);
6976 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006977
Shannon Woods15934d52013-08-19 14:28:49 -04006978 switch (target)
6979 {
6980 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6981 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6982 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6983 if (index >= context->getMaxTransformFeedbackBufferBindings())
6984 return gl::error(GL_INVALID_VALUE);
6985 break;
6986 case GL_UNIFORM_BUFFER_START:
6987 case GL_UNIFORM_BUFFER_SIZE:
6988 case GL_UNIFORM_BUFFER_BINDING:
6989 if (index >= context->getMaximumCombinedUniformBufferBindings())
6990 return gl::error(GL_INVALID_VALUE);
6991 break;
6992 default:
6993 return gl::error(GL_INVALID_ENUM);
6994 }
6995
6996 if (!(context->getIndexedIntegerv(target, index, data)))
6997 {
6998 GLenum nativeType;
6999 unsigned int numParams = 0;
7000 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7001 return gl::error(GL_INVALID_ENUM);
7002
7003 if (numParams == 0)
7004 return; // it is known that pname is valid, but there are no parameters to return
7005
7006 if (nativeType == GL_INT_64_ANGLEX)
7007 {
7008 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7009 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7010 GLint64 *int64Params = new GLint64[numParams];
7011
7012 context->getIndexedInteger64v(target, index, int64Params);
7013
7014 for (unsigned int i = 0; i < numParams; ++i)
7015 {
7016 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7017 data[i] = static_cast<GLint>(clampedValue);
7018 }
7019
7020 delete [] int64Params;
7021 }
7022 else
7023 {
7024 UNREACHABLE();
7025 }
7026 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007028 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007029 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007030 {
7031 return gl::error(GL_OUT_OF_MEMORY);
7032 }
7033}
7034
7035void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7036{
7037 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7038
7039 try
7040 {
7041 gl::Context *context = gl::getNonLostContext();
7042
7043 if (context)
7044 {
7045 if (context->getClientVersion() < 3)
7046 {
7047 return gl::error(GL_INVALID_OPERATION);
7048 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007049
Geoff Langc8058452014-02-03 12:04:11 -05007050 switch (primitiveMode)
7051 {
7052 case GL_TRIANGLES:
7053 case GL_LINES:
7054 case GL_POINTS:
7055 break;
7056 default:
7057 return gl::error(GL_INVALID_ENUM);
7058 }
7059
7060 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7061 ASSERT(transformFeedback != NULL);
7062
7063 if (transformFeedback->isStarted())
7064 {
7065 return gl::error(GL_INVALID_OPERATION);
7066 }
7067
7068 if (transformFeedback->isPaused())
7069 {
7070 transformFeedback->resume();
7071 }
7072 else
7073 {
7074 transformFeedback->start(primitiveMode);
7075 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007076 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007077 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007078 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007079 {
7080 return gl::error(GL_OUT_OF_MEMORY);
7081 }
7082}
7083
7084void __stdcall glEndTransformFeedback(void)
7085{
7086 EVENT("(void)");
7087
7088 try
7089 {
7090 gl::Context *context = gl::getNonLostContext();
7091
7092 if (context)
7093 {
7094 if (context->getClientVersion() < 3)
7095 {
7096 return gl::error(GL_INVALID_OPERATION);
7097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007098
Geoff Langc8058452014-02-03 12:04:11 -05007099 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7100 ASSERT(transformFeedback != NULL);
7101
7102 if (!transformFeedback->isStarted())
7103 {
7104 return gl::error(GL_INVALID_OPERATION);
7105 }
7106
7107 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007109 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007110 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007111 {
7112 return gl::error(GL_OUT_OF_MEMORY);
7113 }
7114}
7115
7116void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7117{
7118 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7119 target, index, buffer, offset, size);
7120
7121 try
7122 {
7123 gl::Context *context = gl::getNonLostContext();
7124
7125 if (context)
7126 {
7127 if (context->getClientVersion() < 3)
7128 {
7129 return gl::error(GL_INVALID_OPERATION);
7130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007131
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007132 switch (target)
7133 {
7134 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007135 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007136 {
7137 return gl::error(GL_INVALID_VALUE);
7138 }
7139 break;
7140
7141 case GL_UNIFORM_BUFFER:
7142 if (index >= context->getMaximumCombinedUniformBufferBindings())
7143 {
7144 return gl::error(GL_INVALID_VALUE);
7145 }
7146 break;
7147
7148 default:
7149 return gl::error(GL_INVALID_ENUM);
7150 }
7151
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007152 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007153 {
7154 return gl::error(GL_INVALID_VALUE);
7155 }
7156
7157 switch (target)
7158 {
7159 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007160
7161 // size and offset must be a multiple of 4
7162 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7163 {
7164 return gl::error(GL_INVALID_VALUE);
7165 }
7166
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007167 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7168 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007169 break;
7170
7171 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007172
7173 // it is an error to bind an offset not a multiple of the alignment
7174 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7175 {
7176 return gl::error(GL_INVALID_VALUE);
7177 }
7178
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007179 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7180 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007181 break;
7182
7183 default:
7184 UNREACHABLE();
7185 }
7186 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007187 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007188 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007189 {
7190 return gl::error(GL_OUT_OF_MEMORY);
7191 }
7192}
7193
7194void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7195{
7196 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7197 target, index, buffer);
7198
7199 try
7200 {
7201 gl::Context *context = gl::getNonLostContext();
7202
7203 if (context)
7204 {
7205 if (context->getClientVersion() < 3)
7206 {
7207 return gl::error(GL_INVALID_OPERATION);
7208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007209
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007210 switch (target)
7211 {
7212 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007213 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007214 {
7215 return gl::error(GL_INVALID_VALUE);
7216 }
7217 break;
7218
7219 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007220 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007221 {
7222 return gl::error(GL_INVALID_VALUE);
7223 }
7224 break;
7225
7226 default:
7227 return gl::error(GL_INVALID_ENUM);
7228 }
7229
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007230 switch (target)
7231 {
7232 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007233 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007234 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007235 break;
7236
7237 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007238 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007239 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007240 break;
7241
7242 default:
7243 UNREACHABLE();
7244 }
7245 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007246 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007247 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007248 {
7249 return gl::error(GL_OUT_OF_MEMORY);
7250 }
7251}
7252
7253void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7254{
7255 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7256 program, count, varyings, bufferMode);
7257
7258 try
7259 {
7260 gl::Context *context = gl::getNonLostContext();
7261
7262 if (context)
7263 {
7264 if (context->getClientVersion() < 3)
7265 {
7266 return gl::error(GL_INVALID_OPERATION);
7267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007268
Geoff Lang48dcae72014-02-05 16:28:24 -05007269 if (count < 0)
7270 {
7271 return gl::error(GL_INVALID_VALUE);
7272 }
7273
7274 switch (bufferMode)
7275 {
7276 case GL_INTERLEAVED_ATTRIBS:
7277 break;
7278 case GL_SEPARATE_ATTRIBS:
7279 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7280 {
7281 return gl::error(GL_INVALID_VALUE);
7282 }
7283 break;
7284 default:
7285 return gl::error(GL_INVALID_ENUM);
7286 }
7287
7288 if (!gl::ValidProgram(context, program))
7289 {
7290 return;
7291 }
7292
7293 gl::Program *programObject = context->getProgram(program);
7294 ASSERT(programObject);
7295
7296 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007298 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007299 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007300 {
7301 return gl::error(GL_OUT_OF_MEMORY);
7302 }
7303}
7304
7305void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7306{
7307 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7308 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7309 program, index, bufSize, length, size, type, name);
7310
7311 try
7312 {
7313 gl::Context *context = gl::getNonLostContext();
7314
7315 if (context)
7316 {
7317 if (context->getClientVersion() < 3)
7318 {
7319 return gl::error(GL_INVALID_OPERATION);
7320 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007321
Geoff Lang48dcae72014-02-05 16:28:24 -05007322 if (bufSize < 0)
7323 {
7324 return gl::error(GL_INVALID_VALUE);
7325 }
7326
7327 if (!gl::ValidProgram(context, program))
7328 {
7329 return;
7330 }
7331
7332 gl::Program *programObject = context->getProgram(program);
7333 ASSERT(programObject);
7334
7335 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7336 {
7337 return gl::error(GL_INVALID_VALUE);
7338 }
7339
7340 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007342 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007343 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007344 {
7345 return gl::error(GL_OUT_OF_MEMORY);
7346 }
7347}
7348
7349void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7350{
7351 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7352 index, size, type, stride, pointer);
7353
7354 try
7355 {
7356 gl::Context *context = gl::getNonLostContext();
7357
7358 if (context)
7359 {
7360 if (context->getClientVersion() < 3)
7361 {
7362 return gl::error(GL_INVALID_OPERATION);
7363 }
7364 }
7365
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007366 if (index >= gl::MAX_VERTEX_ATTRIBS)
7367 {
7368 return gl::error(GL_INVALID_VALUE);
7369 }
7370
7371 if (size < 1 || size > 4)
7372 {
7373 return gl::error(GL_INVALID_VALUE);
7374 }
7375
7376 switch (type)
7377 {
7378 case GL_BYTE:
7379 case GL_UNSIGNED_BYTE:
7380 case GL_SHORT:
7381 case GL_UNSIGNED_SHORT:
7382 case GL_INT:
7383 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007384 case GL_INT_2_10_10_10_REV:
7385 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007386 break;
7387 default:
7388 return gl::error(GL_INVALID_ENUM);
7389 }
7390
7391 if (stride < 0)
7392 {
7393 return gl::error(GL_INVALID_VALUE);
7394 }
7395
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007396 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7397 {
7398 return gl::error(GL_INVALID_OPERATION);
7399 }
7400
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007401 if (context)
7402 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007403 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7404 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7405 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7406 // and the pointer argument is not NULL.
7407 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7408 {
7409 return gl::error(GL_INVALID_OPERATION);
7410 }
7411
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007412 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7413 stride, pointer);
7414 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007415 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007416 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007417 {
7418 return gl::error(GL_OUT_OF_MEMORY);
7419 }
7420}
7421
7422void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7423{
7424 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7425 index, pname, params);
7426
7427 try
7428 {
7429 gl::Context *context = gl::getNonLostContext();
7430
7431 if (context)
7432 {
7433 if (context->getClientVersion() < 3)
7434 {
7435 return gl::error(GL_INVALID_OPERATION);
7436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007437
Jamie Madilla7d05862013-07-02 11:57:06 -04007438 if (index >= gl::MAX_VERTEX_ATTRIBS)
7439 {
7440 return gl::error(GL_INVALID_VALUE);
7441 }
7442
7443 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7444
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007445 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007446 {
7447 return;
7448 }
7449
7450 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7451 {
7452 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7453 for (int i = 0; i < 4; ++i)
7454 {
7455 params[i] = currentValueData.IntValues[i];
7456 }
7457 }
7458 else
7459 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007460 *params = gl::QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007461 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007462 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007463 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007464 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007465 {
7466 return gl::error(GL_OUT_OF_MEMORY);
7467 }
7468}
7469
7470void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7471{
7472 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7473 index, pname, params);
7474
7475 try
7476 {
7477 gl::Context *context = gl::getNonLostContext();
7478
7479 if (context)
7480 {
7481 if (context->getClientVersion() < 3)
7482 {
7483 return gl::error(GL_INVALID_OPERATION);
7484 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007485
Jamie Madilla7d05862013-07-02 11:57:06 -04007486 if (index >= gl::MAX_VERTEX_ATTRIBS)
7487 {
7488 return gl::error(GL_INVALID_VALUE);
7489 }
7490
7491 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7492
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007493 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007494 {
7495 return;
7496 }
7497
7498 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7499 {
7500 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7501 for (int i = 0; i < 4; ++i)
7502 {
7503 params[i] = currentValueData.UnsignedIntValues[i];
7504 }
7505 }
7506 else
7507 {
Brandon Jones5bf98292014-06-06 17:19:38 -07007508 *params = gl::QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
Jamie Madilla7d05862013-07-02 11:57:06 -04007509 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007511 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007512 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007513 {
7514 return gl::error(GL_OUT_OF_MEMORY);
7515 }
7516}
7517
7518void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7519{
7520 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7521 index, x, y, z, w);
7522
7523 try
7524 {
7525 gl::Context *context = gl::getNonLostContext();
7526
7527 if (context)
7528 {
7529 if (context->getClientVersion() < 3)
7530 {
7531 return gl::error(GL_INVALID_OPERATION);
7532 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007533
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007534 if (index >= gl::MAX_VERTEX_ATTRIBS)
7535 {
7536 return gl::error(GL_INVALID_VALUE);
7537 }
7538
7539 GLint vals[4] = { x, y, z, w };
7540 context->setVertexAttribi(index, vals);
7541 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007542 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007543 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007544 {
7545 return gl::error(GL_OUT_OF_MEMORY);
7546 }
7547}
7548
7549void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7550{
7551 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7552 index, x, y, z, w);
7553
7554 try
7555 {
7556 gl::Context *context = gl::getNonLostContext();
7557
7558 if (context)
7559 {
7560 if (context->getClientVersion() < 3)
7561 {
7562 return gl::error(GL_INVALID_OPERATION);
7563 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007564
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007565 if (index >= gl::MAX_VERTEX_ATTRIBS)
7566 {
7567 return gl::error(GL_INVALID_VALUE);
7568 }
7569
7570 GLuint vals[4] = { x, y, z, w };
7571 context->setVertexAttribu(index, vals);
7572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007573 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007574 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007575 {
7576 return gl::error(GL_OUT_OF_MEMORY);
7577 }
7578}
7579
7580void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7581{
7582 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7583
7584 try
7585 {
7586 gl::Context *context = gl::getNonLostContext();
7587
7588 if (context)
7589 {
7590 if (context->getClientVersion() < 3)
7591 {
7592 return gl::error(GL_INVALID_OPERATION);
7593 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007594
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007595 if (index >= gl::MAX_VERTEX_ATTRIBS)
7596 {
7597 return gl::error(GL_INVALID_VALUE);
7598 }
7599
7600 context->setVertexAttribi(index, v);
7601 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007602 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007603 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007604 {
7605 return gl::error(GL_OUT_OF_MEMORY);
7606 }
7607}
7608
7609void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7610{
7611 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7612
7613 try
7614 {
7615 gl::Context *context = gl::getNonLostContext();
7616
7617 if (context)
7618 {
7619 if (context->getClientVersion() < 3)
7620 {
7621 return gl::error(GL_INVALID_OPERATION);
7622 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007623
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007624 if (index >= gl::MAX_VERTEX_ATTRIBS)
7625 {
7626 return gl::error(GL_INVALID_VALUE);
7627 }
7628
7629 context->setVertexAttribu(index, v);
7630 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007631 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007632 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007633 {
7634 return gl::error(GL_OUT_OF_MEMORY);
7635 }
7636}
7637
7638void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7639{
7640 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7641 program, location, params);
7642
7643 try
7644 {
7645 gl::Context *context = gl::getNonLostContext();
7646
7647 if (context)
7648 {
7649 if (context->getClientVersion() < 3)
7650 {
7651 return gl::error(GL_INVALID_OPERATION);
7652 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007653
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007654 if (program == 0)
7655 {
7656 return gl::error(GL_INVALID_VALUE);
7657 }
7658
7659 gl::Program *programObject = context->getProgram(program);
7660
7661 if (!programObject || !programObject->isLinked())
7662 {
7663 return gl::error(GL_INVALID_OPERATION);
7664 }
7665
7666 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7667 if (!programBinary)
7668 {
7669 return gl::error(GL_INVALID_OPERATION);
7670 }
7671
7672 if (!programBinary->getUniformuiv(location, NULL, params))
7673 {
7674 return gl::error(GL_INVALID_OPERATION);
7675 }
7676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007677 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007678 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007679 {
7680 return gl::error(GL_OUT_OF_MEMORY);
7681 }
7682}
7683
7684GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7685{
7686 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7687 program, name);
7688
7689 try
7690 {
7691 gl::Context *context = gl::getNonLostContext();
7692
7693 if (context)
7694 {
7695 if (context->getClientVersion() < 3)
7696 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007697 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007698 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007699
Jamie Madilld1e78c92013-06-20 11:55:50 -04007700 if (program == 0)
7701 {
7702 return gl::error(GL_INVALID_VALUE, -1);
7703 }
7704
7705 gl::Program *programObject = context->getProgram(program);
7706
7707 if (!programObject || !programObject->isLinked())
7708 {
7709 return gl::error(GL_INVALID_OPERATION, -1);
7710 }
7711
7712 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7713 if (!programBinary)
7714 {
7715 return gl::error(GL_INVALID_OPERATION, -1);
7716 }
7717
7718 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007719 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007720 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007721 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007722 {
7723 return gl::error(GL_OUT_OF_MEMORY, 0);
7724 }
7725
7726 return 0;
7727}
7728
7729void __stdcall glUniform1ui(GLint location, GLuint v0)
7730{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007731 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007732}
7733
7734void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7735{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007736 const GLuint xy[] = { v0, v1 };
7737 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007738}
7739
7740void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7741{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007742 const GLuint xyz[] = { v0, v1, v2 };
7743 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007744}
7745
7746void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7747{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007748 const GLuint xyzw[] = { v0, v1, v2, v3 };
7749 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007750}
7751
7752void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7753{
7754 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7755 location, count, value);
7756
7757 try
7758 {
7759 gl::Context *context = gl::getNonLostContext();
7760
7761 if (context)
7762 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007763 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007764 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007765 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007766 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007767
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007768 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007769 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007771 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007772 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007773 {
7774 return gl::error(GL_OUT_OF_MEMORY);
7775 }
7776}
7777
7778void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7779{
7780 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7781 location, count, value);
7782
7783 try
7784 {
7785 gl::Context *context = gl::getNonLostContext();
7786
7787 if (context)
7788 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007789 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007790 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007791 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007792 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007793
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007794 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007795 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007797 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007798 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007799 {
7800 return gl::error(GL_OUT_OF_MEMORY);
7801 }
7802}
7803
7804void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7805{
7806 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7807 location, count, value);
7808
7809 try
7810 {
7811 gl::Context *context = gl::getNonLostContext();
7812
7813 if (context)
7814 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007815 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007816 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007817 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007819
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007820 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007821 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007823 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007824 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007825 {
7826 return gl::error(GL_OUT_OF_MEMORY);
7827 }
7828}
7829
7830void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7831{
7832 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7833 location, count, value);
7834
7835 try
7836 {
7837 gl::Context *context = gl::getNonLostContext();
7838
7839 if (context)
7840 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007841 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007842 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007843 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007845
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007846 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007847 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007849 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007850 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007851 {
7852 return gl::error(GL_OUT_OF_MEMORY);
7853 }
7854}
7855
7856void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7857{
7858 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7859 buffer, drawbuffer, value);
7860
7861 try
7862 {
7863 gl::Context *context = gl::getNonLostContext();
7864
7865 if (context)
7866 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007867 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007868 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007869 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007871
Geoff Lang42359ca2013-08-21 13:25:17 -04007872 switch (buffer)
7873 {
7874 case GL_COLOR:
7875 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7876 {
7877 return gl::error(GL_INVALID_VALUE);
7878 }
7879 break;
7880 case GL_STENCIL:
7881 if (drawbuffer != 0)
7882 {
7883 return gl::error(GL_INVALID_VALUE);
7884 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007885 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007886 default:
7887 return gl::error(GL_INVALID_ENUM);
7888 }
7889
7890 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007892 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007893 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007894 {
7895 return gl::error(GL_OUT_OF_MEMORY);
7896 }
7897}
7898
7899void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7900{
7901 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7902 buffer, drawbuffer, value);
7903
7904 try
7905 {
7906 gl::Context *context = gl::getNonLostContext();
7907
7908 if (context)
7909 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007910 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007911 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007912 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007913 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007914
Geoff Lang42359ca2013-08-21 13:25:17 -04007915 switch (buffer)
7916 {
7917 case GL_COLOR:
7918 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7919 {
7920 return gl::error(GL_INVALID_VALUE);
7921 }
7922 break;
7923 default:
7924 return gl::error(GL_INVALID_ENUM);
7925 }
7926
7927 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007929 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007930 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007931 {
7932 return gl::error(GL_OUT_OF_MEMORY);
7933 }
7934}
7935
7936void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
7937{
7938 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
7939 buffer, drawbuffer, value);
7940
7941 try
7942 {
7943 gl::Context *context = gl::getNonLostContext();
7944
7945 if (context)
7946 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007947 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007948 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007949 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007951
Geoff Lang42359ca2013-08-21 13:25:17 -04007952 switch (buffer)
7953 {
7954 case GL_COLOR:
7955 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7956 {
7957 return gl::error(GL_INVALID_VALUE);
7958 }
7959 break;
7960 case GL_DEPTH:
7961 if (drawbuffer != 0)
7962 {
7963 return gl::error(GL_INVALID_VALUE);
7964 }
7965 break;
7966 default:
7967 return gl::error(GL_INVALID_ENUM);
7968 }
7969
7970 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007972 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007973 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007974 {
7975 return gl::error(GL_OUT_OF_MEMORY);
7976 }
7977}
7978
7979void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
7980{
7981 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
7982 buffer, drawbuffer, depth, stencil);
7983
7984 try
7985 {
7986 gl::Context *context = gl::getNonLostContext();
7987
7988 if (context)
7989 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007990 if (!ValidateClearBuffer(context))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007991 {
Jamie Madill13f7d7d2014-06-20 13:21:27 -04007992 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007994
Geoff Lang42359ca2013-08-21 13:25:17 -04007995 switch (buffer)
7996 {
7997 case GL_DEPTH_STENCIL:
7998 if (drawbuffer != 0)
7999 {
8000 return gl::error(GL_INVALID_VALUE);
8001 }
8002 break;
8003 default:
8004 return gl::error(GL_INVALID_ENUM);
8005 }
8006
8007 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008008 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008009 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008010 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008011 {
8012 return gl::error(GL_OUT_OF_MEMORY);
8013 }
8014}
8015
8016const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8017{
8018 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8019
8020 try
8021 {
8022 gl::Context *context = gl::getNonLostContext();
8023
8024 if (context)
8025 {
8026 if (context->getClientVersion() < 3)
8027 {
8028 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008030
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008031 if (name != GL_EXTENSIONS)
8032 {
8033 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8034 }
8035
Geoff Langcec35902014-04-16 10:52:36 -04008036 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008037 {
8038 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8039 }
Geoff Langcec35902014-04-16 10:52:36 -04008040
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008041 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8042 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008043 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008044 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008045 {
8046 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8047 }
8048
8049 return NULL;
8050}
8051
8052void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8053{
8054 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8055 readTarget, writeTarget, readOffset, writeOffset, size);
8056
8057 try
8058 {
8059 gl::Context *context = gl::getNonLostContext();
8060
8061 if (context)
8062 {
8063 if (context->getClientVersion() < 3)
8064 {
8065 return gl::error(GL_INVALID_OPERATION);
8066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008067
Jamie Madill8c96d582014-03-05 15:01:23 -05008068 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008069 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008070 return gl::error(GL_INVALID_ENUM);
8071 }
8072
Jamie Madill8c96d582014-03-05 15:01:23 -05008073 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8074 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008075
8076 if (!readBuffer || !writeBuffer)
8077 {
8078 return gl::error(GL_INVALID_OPERATION);
8079 }
8080
Jamie Madill7a5f7382014-03-05 15:01:24 -05008081 if (readBuffer->mapped() || writeBuffer->mapped())
8082 {
8083 return gl::error(GL_INVALID_OPERATION);
8084 }
8085
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008086 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8087 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8088 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8089 {
8090 return gl::error(GL_INVALID_VALUE);
8091 }
8092
8093 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8094 {
8095 return gl::error(GL_INVALID_VALUE);
8096 }
8097
8098 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8099
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008100 // if size is zero, the copy is a successful no-op
8101 if (size > 0)
8102 {
8103 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8104 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008106 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008107 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108 {
8109 return gl::error(GL_OUT_OF_MEMORY);
8110 }
8111}
8112
8113void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8114{
8115 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8116 program, uniformCount, uniformNames, uniformIndices);
8117
8118 try
8119 {
8120 gl::Context *context = gl::getNonLostContext();
8121
8122 if (context)
8123 {
8124 if (context->getClientVersion() < 3)
8125 {
8126 return gl::error(GL_INVALID_OPERATION);
8127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008128
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008129 if (uniformCount < 0)
8130 {
8131 return gl::error(GL_INVALID_VALUE);
8132 }
8133
8134 gl::Program *programObject = context->getProgram(program);
8135
8136 if (!programObject)
8137 {
8138 if (context->getShader(program))
8139 {
8140 return gl::error(GL_INVALID_OPERATION);
8141 }
8142 else
8143 {
8144 return gl::error(GL_INVALID_VALUE);
8145 }
8146 }
8147
8148 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8149 if (!programObject->isLinked() || !programBinary)
8150 {
8151 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8152 {
8153 uniformIndices[uniformId] = GL_INVALID_INDEX;
8154 }
8155 }
8156 else
8157 {
8158 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8159 {
8160 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8161 }
8162 }
8163 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008165 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008166 {
8167 return gl::error(GL_OUT_OF_MEMORY);
8168 }
8169}
8170
8171void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8172{
8173 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8174 program, uniformCount, uniformIndices, pname, params);
8175
8176 try
8177 {
8178 gl::Context *context = gl::getNonLostContext();
8179
8180 if (context)
8181 {
8182 if (context->getClientVersion() < 3)
8183 {
8184 return gl::error(GL_INVALID_OPERATION);
8185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008186
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008187 if (uniformCount < 0)
8188 {
8189 return gl::error(GL_INVALID_VALUE);
8190 }
8191
8192 gl::Program *programObject = context->getProgram(program);
8193
8194 if (!programObject)
8195 {
8196 if (context->getShader(program))
8197 {
8198 return gl::error(GL_INVALID_OPERATION);
8199 }
8200 else
8201 {
8202 return gl::error(GL_INVALID_VALUE);
8203 }
8204 }
8205
8206 switch (pname)
8207 {
8208 case GL_UNIFORM_TYPE:
8209 case GL_UNIFORM_SIZE:
8210 case GL_UNIFORM_NAME_LENGTH:
8211 case GL_UNIFORM_BLOCK_INDEX:
8212 case GL_UNIFORM_OFFSET:
8213 case GL_UNIFORM_ARRAY_STRIDE:
8214 case GL_UNIFORM_MATRIX_STRIDE:
8215 case GL_UNIFORM_IS_ROW_MAJOR:
8216 break;
8217 default:
8218 return gl::error(GL_INVALID_ENUM);
8219 }
8220
8221 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8222
8223 if (!programBinary && uniformCount > 0)
8224 {
8225 return gl::error(GL_INVALID_VALUE);
8226 }
8227
8228 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8229 {
8230 const GLuint index = uniformIndices[uniformId];
8231
8232 if (index >= (GLuint)programBinary->getActiveUniformCount())
8233 {
8234 return gl::error(GL_INVALID_VALUE);
8235 }
8236 }
8237
8238 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8239 {
8240 const GLuint index = uniformIndices[uniformId];
8241 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8242 }
8243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008244 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008245 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008246 {
8247 return gl::error(GL_OUT_OF_MEMORY);
8248 }
8249}
8250
8251GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8252{
8253 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8254
8255 try
8256 {
8257 gl::Context *context = gl::getNonLostContext();
8258
8259 if (context)
8260 {
8261 if (context->getClientVersion() < 3)
8262 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008263 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008265
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008266 gl::Program *programObject = context->getProgram(program);
8267
8268 if (!programObject)
8269 {
8270 if (context->getShader(program))
8271 {
8272 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8273 }
8274 else
8275 {
8276 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8277 }
8278 }
8279
8280 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8281 if (!programBinary)
8282 {
8283 return GL_INVALID_INDEX;
8284 }
8285
8286 return programBinary->getUniformBlockIndex(uniformBlockName);
8287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008288 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008289 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008290 {
8291 return gl::error(GL_OUT_OF_MEMORY, 0);
8292 }
8293
8294 return 0;
8295}
8296
8297void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8298{
8299 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8300 program, uniformBlockIndex, pname, params);
8301
8302 try
8303 {
8304 gl::Context *context = gl::getNonLostContext();
8305
8306 if (context)
8307 {
8308 if (context->getClientVersion() < 3)
8309 {
8310 return gl::error(GL_INVALID_OPERATION);
8311 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008312 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008313
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008314 if (!programObject)
8315 {
8316 if (context->getShader(program))
8317 {
8318 return gl::error(GL_INVALID_OPERATION);
8319 }
8320 else
8321 {
8322 return gl::error(GL_INVALID_VALUE);
8323 }
8324 }
8325
8326 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8327
8328 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8329 {
8330 return gl::error(GL_INVALID_VALUE);
8331 }
8332
8333 switch (pname)
8334 {
8335 case GL_UNIFORM_BLOCK_BINDING:
8336 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8337 break;
8338
8339 case GL_UNIFORM_BLOCK_DATA_SIZE:
8340 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8341 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8342 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8343 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8344 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8345 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8346 break;
8347
8348 default:
8349 return gl::error(GL_INVALID_ENUM);
8350 }
8351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008352 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008353 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008354 {
8355 return gl::error(GL_OUT_OF_MEMORY);
8356 }
8357}
8358
8359void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8360{
8361 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8362 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8363
8364 try
8365 {
8366 gl::Context *context = gl::getNonLostContext();
8367
8368 if (context)
8369 {
8370 if (context->getClientVersion() < 3)
8371 {
8372 return gl::error(GL_INVALID_OPERATION);
8373 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008374
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008375 gl::Program *programObject = context->getProgram(program);
8376
8377 if (!programObject)
8378 {
8379 if (context->getShader(program))
8380 {
8381 return gl::error(GL_INVALID_OPERATION);
8382 }
8383 else
8384 {
8385 return gl::error(GL_INVALID_VALUE);
8386 }
8387 }
8388
8389 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8390
8391 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8392 {
8393 return gl::error(GL_INVALID_VALUE);
8394 }
8395
8396 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008398 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008399 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008400 {
8401 return gl::error(GL_OUT_OF_MEMORY);
8402 }
8403}
8404
8405void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8406{
8407 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8408 program, uniformBlockIndex, uniformBlockBinding);
8409
8410 try
8411 {
8412 gl::Context *context = gl::getNonLostContext();
8413
8414 if (context)
8415 {
8416 if (context->getClientVersion() < 3)
8417 {
8418 return gl::error(GL_INVALID_OPERATION);
8419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008420
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008421 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8422 {
8423 return gl::error(GL_INVALID_VALUE);
8424 }
8425
8426 gl::Program *programObject = context->getProgram(program);
8427
8428 if (!programObject)
8429 {
8430 if (context->getShader(program))
8431 {
8432 return gl::error(GL_INVALID_OPERATION);
8433 }
8434 else
8435 {
8436 return gl::error(GL_INVALID_VALUE);
8437 }
8438 }
8439
8440 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8441
8442 // if never linked, there won't be any uniform blocks
8443 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8444 {
8445 return gl::error(GL_INVALID_VALUE);
8446 }
8447
8448 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008450 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008451 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008452 {
8453 return gl::error(GL_OUT_OF_MEMORY);
8454 }
8455}
8456
8457void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8458{
8459 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8460 mode, first, count, instanceCount);
8461
8462 try
8463 {
8464 gl::Context *context = gl::getNonLostContext();
8465
8466 if (context)
8467 {
8468 if (context->getClientVersion() < 3)
8469 {
8470 return gl::error(GL_INVALID_OPERATION);
8471 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008472
Jamie Madill54133512013-06-21 09:33:07 -04008473 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008474 UNIMPLEMENTED();
8475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008476 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008477 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008478 {
8479 return gl::error(GL_OUT_OF_MEMORY);
8480 }
8481}
8482
8483void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8484{
8485 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8486 mode, count, type, indices, instanceCount);
8487
8488 try
8489 {
8490 gl::Context *context = gl::getNonLostContext();
8491
8492 if (context)
8493 {
8494 if (context->getClientVersion() < 3)
8495 {
8496 return gl::error(GL_INVALID_OPERATION);
8497 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008498
Jamie Madill54133512013-06-21 09:33:07 -04008499 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008500 UNIMPLEMENTED();
8501 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008502 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008503 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008504 {
8505 return gl::error(GL_OUT_OF_MEMORY);
8506 }
8507}
8508
8509GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8510{
8511 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8512
8513 try
8514 {
8515 gl::Context *context = gl::getNonLostContext();
8516
8517 if (context)
8518 {
8519 if (context->getClientVersion() < 3)
8520 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008521 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008522 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008523
Jamie Madill5215e1a2013-07-26 11:55:19 -04008524 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8525 {
8526 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8527 }
8528
8529 if (flags != 0)
8530 {
8531 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8532 }
8533
8534 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008535 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008536 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008537 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008538 {
8539 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8540 }
8541
8542 return NULL;
8543}
8544
8545GLboolean __stdcall glIsSync(GLsync sync)
8546{
8547 EVENT("(GLsync sync = 0x%0.8p)", sync);
8548
8549 try
8550 {
8551 gl::Context *context = gl::getNonLostContext();
8552
8553 if (context)
8554 {
8555 if (context->getClientVersion() < 3)
8556 {
8557 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008559
Jamie Madill5215e1a2013-07-26 11:55:19 -04008560 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008561 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008562 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008563 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008564 {
8565 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8566 }
8567
8568 return GL_FALSE;
8569}
8570
8571void __stdcall glDeleteSync(GLsync sync)
8572{
8573 EVENT("(GLsync sync = 0x%0.8p)", sync);
8574
8575 try
8576 {
8577 gl::Context *context = gl::getNonLostContext();
8578
8579 if (context)
8580 {
8581 if (context->getClientVersion() < 3)
8582 {
8583 return gl::error(GL_INVALID_OPERATION);
8584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008585
Jamie Madill5215e1a2013-07-26 11:55:19 -04008586 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8587 {
8588 return gl::error(GL_INVALID_VALUE);
8589 }
8590
8591 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008593 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008594 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008595 {
8596 return gl::error(GL_OUT_OF_MEMORY);
8597 }
8598}
8599
8600GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8601{
8602 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8603 sync, flags, timeout);
8604
8605 try
8606 {
8607 gl::Context *context = gl::getNonLostContext();
8608
8609 if (context)
8610 {
8611 if (context->getClientVersion() < 3)
8612 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008613 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008614 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008615
Jamie Madill5215e1a2013-07-26 11:55:19 -04008616 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8617 {
8618 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8619 }
8620
8621 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8622
8623 if (!fenceSync)
8624 {
8625 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8626 }
8627
8628 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008629 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008630 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008631 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008632 {
8633 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8634 }
8635
8636 return GL_FALSE;
8637}
8638
8639void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8640{
8641 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8642 sync, flags, timeout);
8643
8644 try
8645 {
8646 gl::Context *context = gl::getNonLostContext();
8647
8648 if (context)
8649 {
8650 if (context->getClientVersion() < 3)
8651 {
8652 return gl::error(GL_INVALID_OPERATION);
8653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008654
Jamie Madill5215e1a2013-07-26 11:55:19 -04008655 if (flags != 0)
8656 {
8657 return gl::error(GL_INVALID_VALUE);
8658 }
8659
8660 if (timeout != GL_TIMEOUT_IGNORED)
8661 {
8662 return gl::error(GL_INVALID_VALUE);
8663 }
8664
8665 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8666
8667 if (!fenceSync)
8668 {
8669 return gl::error(GL_INVALID_VALUE);
8670 }
8671
8672 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008674 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008675 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008676 {
8677 return gl::error(GL_OUT_OF_MEMORY);
8678 }
8679}
8680
8681void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8682{
8683 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8684 pname, params);
8685
8686 try
8687 {
8688 gl::Context *context = gl::getNonLostContext();
8689
8690 if (context)
8691 {
8692 if (context->getClientVersion() < 3)
8693 {
8694 return gl::error(GL_INVALID_OPERATION);
8695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008696
Jamie Madill79f2f452013-12-19 11:13:02 -05008697 GLenum nativeType;
8698 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008699 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8700 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008701 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008702 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008703
8704 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008705 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008706 context->getInteger64v(pname, params);
8707 }
Jamie Madill55856b12014-01-02 13:59:50 -05008708 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008709 {
Jamie Madill55856b12014-01-02 13:59:50 -05008710 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008711 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008713 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008714 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008715 {
8716 return gl::error(GL_OUT_OF_MEMORY);
8717 }
8718}
8719
8720void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8721{
8722 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8723 sync, pname, bufSize, length, values);
8724
8725 try
8726 {
8727 gl::Context *context = gl::getNonLostContext();
8728
8729 if (context)
8730 {
8731 if (context->getClientVersion() < 3)
8732 {
8733 return gl::error(GL_INVALID_OPERATION);
8734 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008735
Jamie Madill5215e1a2013-07-26 11:55:19 -04008736 if (bufSize < 0)
8737 {
8738 return gl::error(GL_INVALID_VALUE);
8739 }
8740
8741 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8742
8743 if (!fenceSync)
8744 {
8745 return gl::error(GL_INVALID_VALUE);
8746 }
8747
8748 switch (pname)
8749 {
8750 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8751 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8752 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8753 case GL_SYNC_FLAGS: values[0] = 0; break;
8754
8755 default:
8756 return gl::error(GL_INVALID_ENUM);
8757 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008758 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008759 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008760 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008761 {
8762 return gl::error(GL_OUT_OF_MEMORY);
8763 }
8764}
8765
8766void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8767{
8768 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8769 target, index, data);
8770
8771 try
8772 {
8773 gl::Context *context = gl::getNonLostContext();
8774
8775 if (context)
8776 {
8777 if (context->getClientVersion() < 3)
8778 {
8779 return gl::error(GL_INVALID_OPERATION);
8780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008781
Shannon Woods15934d52013-08-19 14:28:49 -04008782 switch (target)
8783 {
8784 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8785 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8786 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8787 if (index >= context->getMaxTransformFeedbackBufferBindings())
8788 return gl::error(GL_INVALID_VALUE);
8789 break;
8790 case GL_UNIFORM_BUFFER_START:
8791 case GL_UNIFORM_BUFFER_SIZE:
8792 case GL_UNIFORM_BUFFER_BINDING:
8793 if (index >= context->getMaximumCombinedUniformBufferBindings())
8794 return gl::error(GL_INVALID_VALUE);
8795 break;
8796 default:
8797 return gl::error(GL_INVALID_ENUM);
8798 }
8799
8800 if (!(context->getIndexedInteger64v(target, index, data)))
8801 {
8802 GLenum nativeType;
8803 unsigned int numParams = 0;
8804 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8805 return gl::error(GL_INVALID_ENUM);
8806
8807 if (numParams == 0)
8808 return; // it is known that pname is valid, but there are no parameters to return
8809
8810 if (nativeType == GL_INT)
8811 {
8812 GLint *intParams = new GLint[numParams];
8813
8814 context->getIndexedIntegerv(target, index, intParams);
8815
8816 for (unsigned int i = 0; i < numParams; ++i)
8817 {
8818 data[i] = static_cast<GLint64>(intParams[i]);
8819 }
8820
8821 delete [] intParams;
8822 }
8823 else
8824 {
8825 UNREACHABLE();
8826 }
8827 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008828 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008829 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008830 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008831 {
8832 return gl::error(GL_OUT_OF_MEMORY);
8833 }
8834}
8835
8836void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8837{
8838 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8839 target, pname, params);
8840
8841 try
8842 {
8843 gl::Context *context = gl::getNonLostContext();
8844
8845 if (context)
8846 {
8847 if (context->getClientVersion() < 3)
8848 {
8849 return gl::error(GL_INVALID_OPERATION);
8850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008851
Jamie Madill70656a62014-03-05 15:01:26 -05008852 if (!gl::ValidBufferTarget(context, target))
8853 {
8854 return gl::error(GL_INVALID_ENUM);
8855 }
8856
8857 if (!gl::ValidBufferParameter(context, pname))
8858 {
8859 return gl::error(GL_INVALID_ENUM);
8860 }
8861
8862 gl::Buffer *buffer = context->getTargetBuffer(target);
8863
8864 if (!buffer)
8865 {
8866 // A null buffer means that "0" is bound to the requested buffer target
8867 return gl::error(GL_INVALID_OPERATION);
8868 }
8869
8870 switch (pname)
8871 {
8872 case GL_BUFFER_USAGE:
8873 *params = static_cast<GLint64>(buffer->usage());
8874 break;
8875 case GL_BUFFER_SIZE:
8876 *params = buffer->size();
8877 break;
8878 case GL_BUFFER_ACCESS_FLAGS:
8879 *params = static_cast<GLint64>(buffer->accessFlags());
8880 break;
8881 case GL_BUFFER_MAPPED:
8882 *params = static_cast<GLint64>(buffer->mapped());
8883 break;
8884 case GL_BUFFER_MAP_OFFSET:
8885 *params = buffer->mapOffset();
8886 break;
8887 case GL_BUFFER_MAP_LENGTH:
8888 *params = buffer->mapLength();
8889 break;
8890 default: UNREACHABLE(); break;
8891 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008893 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008894 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008895 {
8896 return gl::error(GL_OUT_OF_MEMORY);
8897 }
8898}
8899
8900void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8901{
8902 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8903
8904 try
8905 {
8906 gl::Context *context = gl::getNonLostContext();
8907
8908 if (context)
8909 {
8910 if (context->getClientVersion() < 3)
8911 {
8912 return gl::error(GL_INVALID_OPERATION);
8913 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008914
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008915 if (count < 0)
8916 {
8917 return gl::error(GL_INVALID_VALUE);
8918 }
8919
8920 for (int i = 0; i < count; i++)
8921 {
8922 samplers[i] = context->createSampler();
8923 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008924 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008925 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008926 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008927 {
8928 return gl::error(GL_OUT_OF_MEMORY);
8929 }
8930}
8931
8932void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8933{
8934 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8935
8936 try
8937 {
8938 gl::Context *context = gl::getNonLostContext();
8939
8940 if (context)
8941 {
8942 if (context->getClientVersion() < 3)
8943 {
8944 return gl::error(GL_INVALID_OPERATION);
8945 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008946
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008947 if (count < 0)
8948 {
8949 return gl::error(GL_INVALID_VALUE);
8950 }
8951
8952 for (int i = 0; i < count; i++)
8953 {
8954 context->deleteSampler(samplers[i]);
8955 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008957 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008958 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008959 {
8960 return gl::error(GL_OUT_OF_MEMORY);
8961 }
8962}
8963
8964GLboolean __stdcall glIsSampler(GLuint sampler)
8965{
8966 EVENT("(GLuint sampler = %u)", sampler);
8967
8968 try
8969 {
8970 gl::Context *context = gl::getNonLostContext();
8971
8972 if (context)
8973 {
8974 if (context->getClientVersion() < 3)
8975 {
8976 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8977 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008978
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008979 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008980 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008981 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008982 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008983 {
8984 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8985 }
8986
8987 return GL_FALSE;
8988}
8989
8990void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8991{
8992 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8993
8994 try
8995 {
8996 gl::Context *context = gl::getNonLostContext();
8997
8998 if (context)
8999 {
9000 if (context->getClientVersion() < 3)
9001 {
9002 return gl::error(GL_INVALID_OPERATION);
9003 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009004
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009005 if (sampler != 0 && !context->isSampler(sampler))
9006 {
9007 return gl::error(GL_INVALID_OPERATION);
9008 }
9009
9010 if (unit >= context->getMaximumCombinedTextureImageUnits())
9011 {
9012 return gl::error(GL_INVALID_VALUE);
9013 }
9014
9015 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009016 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009017 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009018 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009019 {
9020 return gl::error(GL_OUT_OF_MEMORY);
9021 }
9022}
9023
9024void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9025{
9026 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9027
9028 try
9029 {
9030 gl::Context *context = gl::getNonLostContext();
9031
9032 if (context)
9033 {
9034 if (context->getClientVersion() < 3)
9035 {
9036 return gl::error(GL_INVALID_OPERATION);
9037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009038
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009039 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009040 {
9041 return;
9042 }
9043
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009044 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009045 {
9046 return;
9047 }
9048
9049 if (!context->isSampler(sampler))
9050 {
9051 return gl::error(GL_INVALID_OPERATION);
9052 }
9053
9054 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009056 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009057 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009058 {
9059 return gl::error(GL_OUT_OF_MEMORY);
9060 }
9061}
9062
9063void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9064{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009065 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009066}
9067
9068void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9069{
9070 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009083 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009084 {
9085 return;
9086 }
9087
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009088 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009089 {
9090 return;
9091 }
9092
9093 if (!context->isSampler(sampler))
9094 {
9095 return gl::error(GL_INVALID_OPERATION);
9096 }
9097
9098 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009100 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009101 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009102 {
9103 return gl::error(GL_OUT_OF_MEMORY);
9104 }
9105}
9106
9107void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9108{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009109 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009110}
9111
9112void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9113{
9114 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9115
9116 try
9117 {
9118 gl::Context *context = gl::getNonLostContext();
9119
9120 if (context)
9121 {
9122 if (context->getClientVersion() < 3)
9123 {
9124 return gl::error(GL_INVALID_OPERATION);
9125 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009126
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009127 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009128 {
9129 return;
9130 }
9131
9132 if (!context->isSampler(sampler))
9133 {
9134 return gl::error(GL_INVALID_OPERATION);
9135 }
9136
9137 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009138 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009139 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009140 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009141 {
9142 return gl::error(GL_OUT_OF_MEMORY);
9143 }
9144}
9145
9146void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9147{
9148 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9149
9150 try
9151 {
9152 gl::Context *context = gl::getNonLostContext();
9153
9154 if (context)
9155 {
9156 if (context->getClientVersion() < 3)
9157 {
9158 return gl::error(GL_INVALID_OPERATION);
9159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009161 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009162 {
9163 return;
9164 }
9165
9166 if (!context->isSampler(sampler))
9167 {
9168 return gl::error(GL_INVALID_OPERATION);
9169 }
9170
9171 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009173 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009174 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009175 {
9176 return gl::error(GL_OUT_OF_MEMORY);
9177 }
9178}
9179
9180void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9181{
9182 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9183
9184 try
9185 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009186 if (index >= gl::MAX_VERTEX_ATTRIBS)
9187 {
9188 return gl::error(GL_INVALID_VALUE);
9189 }
9190
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009191 gl::Context *context = gl::getNonLostContext();
9192
9193 if (context)
9194 {
9195 if (context->getClientVersion() < 3)
9196 {
9197 return gl::error(GL_INVALID_OPERATION);
9198 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009199
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009200 context->setVertexAttribDivisor(index, divisor);
9201 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009202 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009203 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009204 {
9205 return gl::error(GL_OUT_OF_MEMORY);
9206 }
9207}
9208
9209void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9210{
9211 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9212
9213 try
9214 {
9215 gl::Context *context = gl::getNonLostContext();
9216
9217 if (context)
9218 {
9219 if (context->getClientVersion() < 3)
9220 {
9221 return gl::error(GL_INVALID_OPERATION);
9222 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009223
Geoff Langc8058452014-02-03 12:04:11 -05009224 switch (target)
9225 {
9226 case GL_TRANSFORM_FEEDBACK:
9227 {
9228 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9229 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9230 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9231 {
9232 return gl::error(GL_INVALID_OPERATION);
9233 }
9234
9235 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9236 if (context->getTransformFeedback(id) == NULL)
9237 {
9238 return gl::error(GL_INVALID_OPERATION);
9239 }
9240
9241 context->bindTransformFeedback(id);
9242 }
9243 break;
9244
9245 default:
9246 return gl::error(GL_INVALID_ENUM);
9247 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009248 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009249 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009250 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009251 {
9252 return gl::error(GL_OUT_OF_MEMORY);
9253 }
9254}
9255
9256void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9257{
9258 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9259
9260 try
9261 {
9262 gl::Context *context = gl::getNonLostContext();
9263
9264 if (context)
9265 {
9266 if (context->getClientVersion() < 3)
9267 {
9268 return gl::error(GL_INVALID_OPERATION);
9269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009270
Geoff Langc8058452014-02-03 12:04:11 -05009271 for (int i = 0; i < n; i++)
9272 {
9273 context->deleteTransformFeedback(ids[i]);
9274 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009276 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009277 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009278 {
9279 return gl::error(GL_OUT_OF_MEMORY);
9280 }
9281}
9282
9283void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9284{
9285 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9286
9287 try
9288 {
9289 gl::Context *context = gl::getNonLostContext();
9290
9291 if (context)
9292 {
9293 if (context->getClientVersion() < 3)
9294 {
9295 return gl::error(GL_INVALID_OPERATION);
9296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009297
Geoff Langc8058452014-02-03 12:04:11 -05009298 for (int i = 0; i < n; i++)
9299 {
9300 ids[i] = context->createTransformFeedback();
9301 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009302 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009303 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009304 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009305 {
9306 return gl::error(GL_OUT_OF_MEMORY);
9307 }
9308}
9309
9310GLboolean __stdcall glIsTransformFeedback(GLuint id)
9311{
9312 EVENT("(GLuint id = %u)", id);
9313
9314 try
9315 {
9316 gl::Context *context = gl::getNonLostContext();
9317
9318 if (context)
9319 {
9320 if (context->getClientVersion() < 3)
9321 {
9322 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009324
Geoff Langc8058452014-02-03 12:04:11 -05009325 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009326 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009327 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009328 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009329 {
9330 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9331 }
9332
9333 return GL_FALSE;
9334}
9335
9336void __stdcall glPauseTransformFeedback(void)
9337{
9338 EVENT("(void)");
9339
9340 try
9341 {
9342 gl::Context *context = gl::getNonLostContext();
9343
9344 if (context)
9345 {
9346 if (context->getClientVersion() < 3)
9347 {
9348 return gl::error(GL_INVALID_OPERATION);
9349 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009350
Geoff Langc8058452014-02-03 12:04:11 -05009351 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9352 ASSERT(transformFeedback != NULL);
9353
9354 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9355 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9356 {
9357 return gl::error(GL_INVALID_OPERATION);
9358 }
9359
9360 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009362 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009363 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009364 {
9365 return gl::error(GL_OUT_OF_MEMORY);
9366 }
9367}
9368
9369void __stdcall glResumeTransformFeedback(void)
9370{
9371 EVENT("(void)");
9372
9373 try
9374 {
9375 gl::Context *context = gl::getNonLostContext();
9376
9377 if (context)
9378 {
9379 if (context->getClientVersion() < 3)
9380 {
9381 return gl::error(GL_INVALID_OPERATION);
9382 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009383
Geoff Langc8058452014-02-03 12:04:11 -05009384 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9385 ASSERT(transformFeedback != NULL);
9386
9387 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9388 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9389 {
9390 return gl::error(GL_INVALID_OPERATION);
9391 }
9392
9393 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009395 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009396 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009397 {
9398 return gl::error(GL_OUT_OF_MEMORY);
9399 }
9400}
9401
9402void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9403{
9404 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9405 program, bufSize, length, binaryFormat, binary);
9406
9407 try
9408 {
9409 gl::Context *context = gl::getNonLostContext();
9410
9411 if (context)
9412 {
9413 if (context->getClientVersion() < 3)
9414 {
9415 return gl::error(GL_INVALID_OPERATION);
9416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009417
Jamie Madill54133512013-06-21 09:33:07 -04009418 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009419 UNIMPLEMENTED();
9420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009421 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009422 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009423 {
9424 return gl::error(GL_OUT_OF_MEMORY);
9425 }
9426}
9427
9428void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9429{
9430 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9431 program, binaryFormat, binary, length);
9432
9433 try
9434 {
9435 gl::Context *context = gl::getNonLostContext();
9436
9437 if (context)
9438 {
9439 if (context->getClientVersion() < 3)
9440 {
9441 return gl::error(GL_INVALID_OPERATION);
9442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009443
Jamie Madill54133512013-06-21 09:33:07 -04009444 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009445 UNIMPLEMENTED();
9446 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009447 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009448 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009449 {
9450 return gl::error(GL_OUT_OF_MEMORY);
9451 }
9452}
9453
9454void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9455{
9456 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9457 program, pname, value);
9458
9459 try
9460 {
9461 gl::Context *context = gl::getNonLostContext();
9462
9463 if (context)
9464 {
9465 if (context->getClientVersion() < 3)
9466 {
9467 return gl::error(GL_INVALID_OPERATION);
9468 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009469
Jamie Madill54133512013-06-21 09:33:07 -04009470 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009471 UNIMPLEMENTED();
9472 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009473 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009474 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009475 {
9476 return gl::error(GL_OUT_OF_MEMORY);
9477 }
9478}
9479
9480void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9481{
9482 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9483 target, numAttachments, attachments);
9484
9485 try
9486 {
9487 gl::Context *context = gl::getNonLostContext();
9488
9489 if (context)
9490 {
9491 if (context->getClientVersion() < 3)
9492 {
9493 return gl::error(GL_INVALID_OPERATION);
9494 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009495
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009496 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009497 {
9498 return;
9499 }
9500
9501 int maxDimension = context->getMaximumRenderbufferDimension();
9502 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009504 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009505 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009506 {
9507 return gl::error(GL_OUT_OF_MEMORY);
9508 }
9509}
9510
9511void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9512{
9513 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9514 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9515 target, numAttachments, attachments, x, y, width, height);
9516
9517 try
9518 {
9519 gl::Context *context = gl::getNonLostContext();
9520
9521 if (context)
9522 {
9523 if (context->getClientVersion() < 3)
9524 {
9525 return gl::error(GL_INVALID_OPERATION);
9526 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009527
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009528 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009529 {
9530 return;
9531 }
9532
9533 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009535 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009536 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009537 {
9538 return gl::error(GL_OUT_OF_MEMORY);
9539 }
9540}
9541
9542void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9543{
9544 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9545 target, levels, internalformat, width, height);
9546
9547 try
9548 {
9549 gl::Context *context = gl::getNonLostContext();
9550
9551 if (context)
9552 {
9553 if (context->getClientVersion() < 3)
9554 {
9555 return gl::error(GL_INVALID_OPERATION);
9556 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009557
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009558 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009559 {
9560 return;
9561 }
9562
9563 switch (target)
9564 {
9565 case GL_TEXTURE_2D:
9566 {
9567 gl::Texture2D *texture2d = context->getTexture2D();
9568 texture2d->storage(levels, internalformat, width, height);
9569 }
9570 break;
9571
Geoff Lang01c21d22013-09-24 11:52:16 -04009572 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009573 {
9574 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9575 textureCube->storage(levels, internalformat, width);
9576 }
9577 break;
9578
9579 default:
9580 return gl::error(GL_INVALID_ENUM);
9581 }
9582 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009583 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009584 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009585 {
9586 return gl::error(GL_OUT_OF_MEMORY);
9587 }
9588}
9589
9590void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9591{
9592 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9593 "GLsizei height = %d, GLsizei depth = %d)",
9594 target, levels, internalformat, width, height, depth);
9595
9596 try
9597 {
9598 gl::Context *context = gl::getNonLostContext();
9599
9600 if (context)
9601 {
9602 if (context->getClientVersion() < 3)
9603 {
9604 return gl::error(GL_INVALID_OPERATION);
9605 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009606
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009607 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009608 {
9609 return;
9610 }
9611
9612 switch (target)
9613 {
9614 case GL_TEXTURE_3D:
9615 {
9616 gl::Texture3D *texture3d = context->getTexture3D();
9617 texture3d->storage(levels, internalformat, width, height, depth);
9618 }
9619 break;
9620
9621 case GL_TEXTURE_2D_ARRAY:
9622 {
9623 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9624 texture2darray->storage(levels, internalformat, width, height, depth);
9625 }
9626 break;
9627
9628 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009629 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009630 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009632 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009633 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009634 {
9635 return gl::error(GL_OUT_OF_MEMORY);
9636 }
9637}
9638
9639void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9640{
9641 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9642 "GLint* params = 0x%0.8p)",
9643 target, internalformat, pname, bufSize, params);
9644
9645 try
9646 {
9647 gl::Context *context = gl::getNonLostContext();
9648
9649 if (context)
9650 {
9651 if (context->getClientVersion() < 3)
9652 {
9653 return gl::error(GL_INVALID_OPERATION);
9654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009655
Geoff Langcec35902014-04-16 10:52:36 -04009656 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
9657 if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
Shannon Woods809d2502013-07-08 10:32:18 -04009658 {
9659 return gl::error(GL_INVALID_ENUM);
9660 }
9661
9662 if (target != GL_RENDERBUFFER)
9663 {
9664 return gl::error(GL_INVALID_ENUM);
9665 }
9666
9667 if (bufSize < 0)
9668 {
9669 return gl::error(GL_INVALID_VALUE);
9670 }
9671
9672 switch (pname)
9673 {
9674 case GL_NUM_SAMPLE_COUNTS:
9675 if (bufSize != 0)
9676 *params = context->getNumSampleCounts(internalformat);
9677 break;
9678 case GL_SAMPLES:
9679 context->getSampleCounts(internalformat, bufSize, params);
9680 break;
9681 default:
9682 return gl::error(GL_INVALID_ENUM);
9683 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009684 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009685 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009686 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009687 {
9688 return gl::error(GL_OUT_OF_MEMORY);
9689 }
9690}
9691
9692// Extension functions
9693
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009694void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9695 GLbitfield mask, GLenum filter)
9696{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009697 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009698 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9699 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9700 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9701
9702 try
9703 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009704 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009705
9706 if (context)
9707 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009708 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009709 dstX0, dstY0, dstX1, dstY1, mask, filter,
9710 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009711 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009712 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009713 }
9714
Geoff Lang758d5b22013-06-11 11:42:50 -04009715 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9716 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009717 }
9718 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009719 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009722 }
9723}
9724
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009725void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9726 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009727{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009728 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009729 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009730 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009731 target, level, internalformat, width, height, depth, border, format, type, pixels);
9732
9733 try
9734 {
9735 UNIMPLEMENTED(); // FIXME
9736 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009737 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009740 }
9741}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009742
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009743void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9744 GLenum *binaryFormat, void *binary)
9745{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009746 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 +00009747 program, bufSize, length, binaryFormat, binary);
9748
9749 try
9750 {
9751 gl::Context *context = gl::getNonLostContext();
9752
9753 if (context)
9754 {
9755 gl::Program *programObject = context->getProgram(program);
9756
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009757 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009759 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009760 }
9761
9762 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9763
9764 if (!programBinary)
9765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009766 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009767 }
9768
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009769 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009771 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009772 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009773
9774 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009775 }
9776 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009777 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009779 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009780 }
9781}
9782
9783void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9784 const void *binary, GLint length)
9785{
9786 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9787 program, binaryFormat, binary, length);
9788
9789 try
9790 {
9791 gl::Context *context = gl::getNonLostContext();
9792
9793 if (context)
9794 {
9795 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009797 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009798 }
9799
9800 gl::Program *programObject = context->getProgram(program);
9801
9802 if (!programObject)
9803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009804 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009805 }
9806
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009807 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009808 }
9809 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009810 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009812 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009813 }
9814}
9815
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009816void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9817{
9818 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9819
9820 try
9821 {
9822 gl::Context *context = gl::getNonLostContext();
9823
9824 if (context)
9825 {
9826 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9827 {
9828 return gl::error(GL_INVALID_VALUE);
9829 }
9830
9831 if (context->getDrawFramebufferHandle() == 0)
9832 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009833 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009834 {
9835 return gl::error(GL_INVALID_OPERATION);
9836 }
9837
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009838 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009839 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009840 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009841 }
9842 }
9843 else
9844 {
9845 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9846 {
9847 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9848 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9849 {
9850 return gl::error(GL_INVALID_OPERATION);
9851 }
9852 }
9853 }
9854
9855 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9856
9857 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9858 {
9859 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9860 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009861
9862 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9863 {
9864 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9865 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009866 }
9867 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009868 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009869 {
9870 return gl::error(GL_OUT_OF_MEMORY);
9871 }
9872}
9873
Shannon Woodsb3801742014-03-27 14:59:19 -04009874void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9875{
9876 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9877
9878 try
9879 {
9880 gl::Context *context = gl::getNonLostContext();
9881
9882 if (context)
9883 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009884 if (!gl::ValidBufferTarget(context, target))
9885 {
9886 return gl::error(GL_INVALID_ENUM);
9887 }
9888
9889 if (pname != GL_BUFFER_MAP_POINTER)
9890 {
9891 return gl::error(GL_INVALID_ENUM);
9892 }
9893
9894 gl::Buffer *buffer = context->getTargetBuffer(target);
9895
9896 if (!buffer || !buffer->mapped())
9897 {
9898 *params = NULL;
9899 }
9900
9901 *params = buffer->mapPointer();
9902 }
9903 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009904 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009905 {
9906 return gl::error(GL_OUT_OF_MEMORY);
9907 }
9908}
9909
9910void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9911{
9912 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9913
9914 try
9915 {
9916 gl::Context *context = gl::getNonLostContext();
9917
9918 if (context)
9919 {
9920 if (!gl::ValidBufferTarget(context, target))
9921 {
9922 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9923 }
9924
9925 gl::Buffer *buffer = context->getTargetBuffer(target);
9926
9927 if (buffer == NULL)
9928 {
9929 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9930 }
9931
9932 if (access != GL_WRITE_ONLY_OES)
9933 {
9934 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9935 }
9936
9937 if (buffer->mapped())
9938 {
9939 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9940 }
9941
9942 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
9943 }
9944 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009945 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009946 {
9947 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
9948 }
9949
9950 return NULL;
9951}
9952
9953GLboolean __stdcall glUnmapBufferOES(GLenum target)
9954{
9955 EVENT("(GLenum target = 0x%X)", target);
9956
9957 try
9958 {
9959 gl::Context *context = gl::getNonLostContext();
9960
9961 if (context)
9962 {
9963 if (!gl::ValidBufferTarget(context, target))
9964 {
9965 return gl::error(GL_INVALID_ENUM, GL_FALSE);
9966 }
9967
9968 gl::Buffer *buffer = context->getTargetBuffer(target);
9969
9970 if (buffer == NULL || !buffer->mapped())
9971 {
9972 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9973 }
9974
9975 // TODO: detect if we had corruption. if so, throw an error and return false.
9976
9977 buffer->unmap();
9978
9979 return GL_TRUE;
9980 }
9981 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009982 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009983 {
9984 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9985 }
9986
9987 return GL_FALSE;
9988}
9989
Shannon Woods916e7692014-03-27 16:58:22 -04009990void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
9991{
9992 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
9993 target, offset, length, access);
9994
9995 try
9996 {
9997 gl::Context *context = gl::getNonLostContext();
9998
9999 if (context)
10000 {
10001 if (!gl::ValidBufferTarget(context, target))
10002 {
10003 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10004 }
10005
10006 if (offset < 0 || length < 0)
10007 {
10008 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10009 }
10010
10011 gl::Buffer *buffer = context->getTargetBuffer(target);
10012
10013 if (buffer == NULL)
10014 {
10015 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10016 }
10017
10018 // Check for buffer overflow
10019 size_t offsetSize = static_cast<size_t>(offset);
10020 size_t lengthSize = static_cast<size_t>(length);
10021
10022 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10023 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10024 {
10025 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10026 }
10027
10028 // Check for invalid bits in the mask
10029 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10030 GL_MAP_WRITE_BIT |
10031 GL_MAP_INVALIDATE_RANGE_BIT |
10032 GL_MAP_INVALIDATE_BUFFER_BIT |
10033 GL_MAP_FLUSH_EXPLICIT_BIT |
10034 GL_MAP_UNSYNCHRONIZED_BIT;
10035
10036 if (access & ~(allAccessBits))
10037 {
10038 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10039 }
10040
10041 if (length == 0 || buffer->mapped())
10042 {
10043 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10044 }
10045
10046 // Check for invalid bit combinations
10047 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10048 {
10049 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10050 }
10051
10052 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10053 GL_MAP_INVALIDATE_BUFFER_BIT |
10054 GL_MAP_UNSYNCHRONIZED_BIT;
10055
10056 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10057 {
10058 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10059 }
10060
10061 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10062 {
10063 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10064 }
10065
10066 return buffer->mapRange(offset, length, access);
10067 }
10068 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010069 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010070 {
10071 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10072 }
10073
10074 return NULL;
10075}
10076
10077void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10078{
10079 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10080
10081 try
10082 {
10083 gl::Context *context = gl::getNonLostContext();
10084
10085 if (context)
10086 {
10087 if (offset < 0 || length < 0)
10088 {
10089 return gl::error(GL_INVALID_VALUE);
10090 }
10091
10092 if (!gl::ValidBufferTarget(context, target))
10093 {
10094 return gl::error(GL_INVALID_ENUM);
10095 }
10096
10097 gl::Buffer *buffer = context->getTargetBuffer(target);
10098
10099 if (buffer == NULL)
10100 {
10101 return gl::error(GL_INVALID_OPERATION);
10102 }
10103
10104 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10105 {
10106 return gl::error(GL_INVALID_OPERATION);
10107 }
10108
10109 // Check for buffer overflow
10110 size_t offsetSize = static_cast<size_t>(offset);
10111 size_t lengthSize = static_cast<size_t>(length);
10112
10113 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10114 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10115 {
10116 return gl::error(GL_INVALID_VALUE);
10117 }
10118
10119 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10120 }
10121 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010122 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010123 {
10124 return gl::error(GL_OUT_OF_MEMORY);
10125 }
10126}
10127
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010128__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10129{
10130 struct Extension
10131 {
10132 const char *name;
10133 __eglMustCastToProperFunctionPointerType address;
10134 };
10135
10136 static const Extension glExtensions[] =
10137 {
10138 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010139 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010140 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010141 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10142 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10143 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10144 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10145 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10146 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10147 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010148 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010149 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010150 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10151 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10152 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10153 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010154 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10155 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10156 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10157 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10158 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10159 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10160 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010161 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010162 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10163 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10164 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010165 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010166 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10167 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10168 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010169 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10170 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10171 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010172
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010173 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010174 {
10175 if (strcmp(procname, glExtensions[ext].name) == 0)
10176 {
10177 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10178 }
10179 }
10180
10181 return NULL;
10182}
10183
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010184// Non-public functions used by EGL
10185
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010186bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010187{
10188 EVENT("(egl::Surface* surface = 0x%0.8p)",
10189 surface);
10190
10191 try
10192 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010193 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010194
10195 if (context)
10196 {
10197 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010198 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010199
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010200 if (textureObject->isImmutable())
10201 {
10202 return false;
10203 }
10204
Geoff Lang32d508e2014-02-11 09:39:48 -050010205 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010206 }
10207 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010208 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010210 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010211 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010212
10213 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010214}
10215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010216}