blob: 0256df681a408963c22b3b20ac13b59fd9f66079 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
Jamie Madillde0ec752014-05-05 15:10:38 -040055 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400104 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400120 if (!ValidateBeginQuery(context, target, id))
Geoff Lang37dde692014-01-31 16:34:54 -0500121 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400122 return;
Geoff Lang37dde692014-01-31 16:34:54 -0500123 }
124
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000125 context->beginQuery(target, id);
126 }
127 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400128 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000131 }
132}
133
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000134void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000136 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
138 try
139 {
140 if (index >= gl::MAX_VERTEX_ATTRIBS)
141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143 }
144
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146
147 if (context)
148 {
149 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000150
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 if (!programObject)
152 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000153 if (context->getShader(program))
154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000156 }
157 else
158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000160 }
161 }
162
163 if (strncmp(name, "gl_", 3) == 0)
164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000165 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166 }
167
168 programObject->bindAttributeLocation(index, name);
169 }
170 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400171 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 }
175}
176
177void __stdcall glBindBuffer(GLenum target, GLuint buffer)
178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000179 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180
181 try
182 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184
185 if (context)
186 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500187 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000188 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500189 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000190 }
191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000192 switch (target)
193 {
194 case GL_ARRAY_BUFFER:
195 context->bindArrayBuffer(buffer);
196 return;
197 case GL_ELEMENT_ARRAY_BUFFER:
198 context->bindElementArrayBuffer(buffer);
199 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000200 case GL_COPY_READ_BUFFER:
201 context->bindCopyReadBuffer(buffer);
202 return;
203 case GL_COPY_WRITE_BUFFER:
204 context->bindCopyWriteBuffer(buffer);
205 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000206 case GL_PIXEL_PACK_BUFFER:
207 context->bindPixelPackBuffer(buffer);
208 return;
209 case GL_PIXEL_UNPACK_BUFFER:
210 context->bindPixelUnpackBuffer(buffer);
211 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000212 case GL_UNIFORM_BUFFER:
213 context->bindGenericUniformBuffer(buffer);
214 return;
215 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000216 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 }
221 }
222 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400223 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 }
227}
228
229void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000231 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000232
233 try
234 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500235 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238 }
239
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241
242 if (context)
243 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000244 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
245 {
246 context->bindReadFramebuffer(framebuffer);
247 }
248
249 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindDrawFramebuffer(framebuffer);
252 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 }
254 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400255 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000257 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259}
260
261void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
267 if (target != GL_RENDERBUFFER)
268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000269 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270 }
271
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273
274 if (context)
275 {
276 context->bindRenderbuffer(renderbuffer);
277 }
278 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400279 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glBindTexture(GLenum target, GLuint texture)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Texture *textureObject = context->getTexture(texture);
296
297 if (textureObject && textureObject->getTarget() != target && texture != 0)
298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300 }
301
302 switch (target)
303 {
304 case GL_TEXTURE_2D:
305 context->bindTexture2D(texture);
306 return;
307 case GL_TEXTURE_CUBE_MAP:
308 context->bindTextureCubeMap(texture);
309 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000310 case GL_TEXTURE_3D:
311 if (context->getClientVersion() < 3)
312 {
313 return gl::error(GL_INVALID_ENUM);
314 }
315 context->bindTexture3D(texture);
316 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000317 case GL_TEXTURE_2D_ARRAY:
318 if (context->getClientVersion() < 3)
319 {
320 return gl::error(GL_INVALID_ENUM);
321 }
322 context->bindTexture2DArray(texture);
323 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326 }
327 }
328 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400329 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 }
333}
334
335void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000337 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000338 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339
340 try
341 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000342 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000343
344 if (context)
345 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000346 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000347 }
348 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400349 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353}
354
355void __stdcall glBlendEquation(GLenum mode)
356{
357 glBlendEquationSeparate(mode, mode);
358}
359
360void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000362 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000363
364 try
365 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000366 gl::Context *context = gl::getNonLostContext();
367
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368 switch (modeRGB)
369 {
370 case GL_FUNC_ADD:
371 case GL_FUNC_SUBTRACT:
372 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000373 case GL_MIN:
374 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000375 break;
376
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000378 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379 }
380
381 switch (modeAlpha)
382 {
383 case GL_FUNC_ADD:
384 case GL_FUNC_SUBTRACT:
385 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000386 case GL_MIN:
387 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388 break;
389
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 }
393
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394 if (context)
395 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000396 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400399 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000401 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403}
404
405void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
406{
407 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
408}
409
410void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 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 +0000413 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000414
415 try
416 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000417 gl::Context *context = gl::getNonLostContext();
418
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419 switch (srcRGB)
420 {
421 case GL_ZERO:
422 case GL_ONE:
423 case GL_SRC_COLOR:
424 case GL_ONE_MINUS_SRC_COLOR:
425 case GL_DST_COLOR:
426 case GL_ONE_MINUS_DST_COLOR:
427 case GL_SRC_ALPHA:
428 case GL_ONE_MINUS_SRC_ALPHA:
429 case GL_DST_ALPHA:
430 case GL_ONE_MINUS_DST_ALPHA:
431 case GL_CONSTANT_COLOR:
432 case GL_ONE_MINUS_CONSTANT_COLOR:
433 case GL_CONSTANT_ALPHA:
434 case GL_ONE_MINUS_CONSTANT_ALPHA:
435 case GL_SRC_ALPHA_SATURATE:
436 break;
437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000439 }
440
441 switch (dstRGB)
442 {
443 case GL_ZERO:
444 case GL_ONE:
445 case GL_SRC_COLOR:
446 case GL_ONE_MINUS_SRC_COLOR:
447 case GL_DST_COLOR:
448 case GL_ONE_MINUS_DST_COLOR:
449 case GL_SRC_ALPHA:
450 case GL_ONE_MINUS_SRC_ALPHA:
451 case GL_DST_ALPHA:
452 case GL_ONE_MINUS_DST_ALPHA:
453 case GL_CONSTANT_COLOR:
454 case GL_ONE_MINUS_CONSTANT_COLOR:
455 case GL_CONSTANT_ALPHA:
456 case GL_ONE_MINUS_CONSTANT_ALPHA:
457 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000458
459 case GL_SRC_ALPHA_SATURATE:
460 if (!context || context->getClientVersion() < 3)
461 {
462 return gl::error(GL_INVALID_ENUM);
463 }
464 break;
465
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469
470 switch (srcAlpha)
471 {
472 case GL_ZERO:
473 case GL_ONE:
474 case GL_SRC_COLOR:
475 case GL_ONE_MINUS_SRC_COLOR:
476 case GL_DST_COLOR:
477 case GL_ONE_MINUS_DST_COLOR:
478 case GL_SRC_ALPHA:
479 case GL_ONE_MINUS_SRC_ALPHA:
480 case GL_DST_ALPHA:
481 case GL_ONE_MINUS_DST_ALPHA:
482 case GL_CONSTANT_COLOR:
483 case GL_ONE_MINUS_CONSTANT_COLOR:
484 case GL_CONSTANT_ALPHA:
485 case GL_ONE_MINUS_CONSTANT_ALPHA:
486 case GL_SRC_ALPHA_SATURATE:
487 break;
488 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 }
491
492 switch (dstAlpha)
493 {
494 case GL_ZERO:
495 case GL_ONE:
496 case GL_SRC_COLOR:
497 case GL_ONE_MINUS_SRC_COLOR:
498 case GL_DST_COLOR:
499 case GL_ONE_MINUS_DST_COLOR:
500 case GL_SRC_ALPHA:
501 case GL_ONE_MINUS_SRC_ALPHA:
502 case GL_DST_ALPHA:
503 case GL_ONE_MINUS_DST_ALPHA:
504 case GL_CONSTANT_COLOR:
505 case GL_ONE_MINUS_CONSTANT_COLOR:
506 case GL_CONSTANT_ALPHA:
507 case GL_ONE_MINUS_CONSTANT_ALPHA:
508 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000509
510 case GL_SRC_ALPHA_SATURATE:
511 if (!context || context->getClientVersion() < 3)
512 {
513 return gl::error(GL_INVALID_ENUM);
514 }
515 break;
516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 }
520
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000521 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
522 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
523
524 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
525 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
526
527 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000529 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 +0000530 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000531 }
532
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 if (context)
534 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000535 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400538 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000540 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542}
543
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000544void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000545{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000546 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 +0000547 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548
549 try
550 {
551 if (size < 0)
552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000553 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000554 }
555
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000556 gl::Context *context = gl::getNonLostContext();
557
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000558 switch (usage)
559 {
560 case GL_STREAM_DRAW:
561 case GL_STATIC_DRAW:
562 case GL_DYNAMIC_DRAW:
563 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000564
565 case GL_STREAM_READ:
566 case GL_STREAM_COPY:
567 case GL_STATIC_READ:
568 case GL_STATIC_COPY:
569 case GL_DYNAMIC_READ:
570 case GL_DYNAMIC_COPY:
571 if (context && context->getClientVersion() < 3)
572 {
573 return gl::error(GL_INVALID_ENUM);
574 }
575 break;
576
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 }
580
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 if (context)
582 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500583 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 }
587
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 gl::Buffer *buffer = context->getTargetBuffer(target);
589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000590 if (!buffer)
591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000593 }
594
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000595 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596 }
597 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400598 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602}
603
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000604void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000606 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 +0000607 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000608
609 try
610 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000611 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000614 }
615
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000616 if (data == NULL)
617 {
618 return;
619 }
620
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000621 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000622
623 if (context)
624 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500625 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000628 }
629
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 gl::Buffer *buffer = context->getTargetBuffer(target);
631
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000632 if (!buffer)
633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000635 }
636
Jamie Madill7a5f7382014-03-05 15:01:24 -0500637 if (buffer->mapped())
638 {
639 return gl::error(GL_INVALID_OPERATION);
640 }
641
Geoff Lang876dc722014-05-01 17:10:24 -0400642 // Check for possible overflow of size + offset
643 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
644 {
645 return gl::error(GL_OUT_OF_MEMORY);
646 }
647
648 if (size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000650 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000651 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000652
653 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000654 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000655 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400656 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 }
660}
661
662GLenum __stdcall glCheckFramebufferStatus(GLenum target)
663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000664 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000665
666 try
667 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500668 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000670 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 }
672
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000673 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674
675 if (context)
676 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500677 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
678 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 return framebuffer->completeness();
680 }
681 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400682 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000684 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000685 }
686
687 return 0;
688}
689
690void __stdcall glClear(GLbitfield mask)
691{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000692 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693
694 try
695 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000696 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000697
698 if (context)
699 {
Geoff Lang0b833232013-08-21 10:13:29 -0400700 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
701
702 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
703 {
704 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
705 }
706
707 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
708 {
709 return gl::error(GL_INVALID_VALUE);
710 }
711
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000712 context->clear(mask);
713 }
714 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400715 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 }
719}
720
721void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000723 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000724 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000725
726 try
727 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729
730 if (context)
731 {
732 context->setClearColor(red, green, blue, alpha);
733 }
734 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400735 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 }
739}
740
741void __stdcall glClearDepthf(GLclampf depth)
742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000743 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000744
745 try
746 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748
749 if (context)
750 {
751 context->setClearDepth(depth);
752 }
753 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400754 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 }
758}
759
760void __stdcall glClearStencil(GLint s)
761{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000762 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763
764 try
765 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000766 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767
768 if (context)
769 {
770 context->setClearStencil(s);
771 }
772 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400773 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 }
777}
778
779void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
780{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000781 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000782 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783
784 try
785 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787
788 if (context)
789 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000790 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000791 }
792 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400793 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 }
797}
798
799void __stdcall glCompileShader(GLuint shader)
800{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000801 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802
803 try
804 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806
807 if (context)
808 {
809 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 if (!shaderObject)
812 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000813 if (context->getProgram(shader))
814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000815 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000816 }
817 else
818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000819 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821 }
822
823 shaderObject->compile();
824 }
825 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400826 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000828 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000829 }
830}
831
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000832void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
833 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000836 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000837 target, level, internalformat, width, height, border, imageSize, data);
838
839 try
840 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000841 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000842
843 if (context)
844 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000845 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400846 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000847 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
848 {
849 return;
850 }
851
852 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400853 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400854 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000855 {
856 return;
857 }
858
859 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000862 }
863
864 switch (target)
865 {
866 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000867 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000868 gl::Texture2D *texture = context->getTexture2D();
869 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000870 }
871 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000872
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000873 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
874 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
875 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000879 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000880 gl::TextureCubeMap *texture = context->getTextureCubeMap();
881 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000882 }
883 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000884
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000885 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000886 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000887 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000889 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400890 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000893 }
894}
895
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000896void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
897 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000899 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000900 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000901 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902 target, level, xoffset, yoffset, width, height, format, imageSize, data);
903
904 try
905 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000906 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000907
908 if (context)
909 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000910 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400911 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000912 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
913 {
914 return;
915 }
916
917 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400918 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400919 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000920 {
921 return;
922 }
923
924 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000927 }
928
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000929 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000930 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000931 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000932 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000933 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000934 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000935 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000936 break;
937
938 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
939 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
940 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
942 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
943 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000944 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000945 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000946 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000947 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000948 break;
949
950 default:
951 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000952 }
953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400955 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000957 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 }
959}
960
961void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
962{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000963 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000964 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000965 target, level, internalformat, x, y, width, height, border);
966
967 try
968 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000970
971 if (context)
972 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400974 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000976 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000977 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000978 }
979
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400981 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000982 0, 0, 0, x, y, width, height, border))
983 {
984 return;
985 }
986
987 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
988
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000989 switch (target)
990 {
991 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000992 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000993 gl::Texture2D *texture = context->getTexture2D();
994 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000995 }
996 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000997
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000998 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
999 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1000 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1002 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1003 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001004 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001005 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1006 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001007 }
1008 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001009
1010 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001011 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001012 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001015 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 }
1019}
1020
1021void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001023 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001024 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025 target, level, xoffset, yoffset, x, y, width, height);
1026
1027 try
1028 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001030
1031 if (context)
1032 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001033 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001036 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001037 return;
1038 }
1039
1040 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001041 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001042 xoffset, yoffset, 0, x, y, width, height, 0))
1043 {
1044 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001045 }
1046
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001047 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001048
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001049 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001050 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001051 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001052 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001053 gl::Texture2D *texture = context->getTexture2D();
1054 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001055 }
1056 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001057
1058 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1060 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001064 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001065 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1066 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001067 }
1068 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001069
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001070 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001072 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001073 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001074 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001075
Jamie Madillde0ec752014-05-05 15:10:38 -04001076 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 }
1080}
1081
1082GLuint __stdcall glCreateProgram(void)
1083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001084 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001085
1086 try
1087 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089
1090 if (context)
1091 {
1092 return context->createProgram();
1093 }
1094 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001095 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001097 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 }
1099
1100 return 0;
1101}
1102
1103GLuint __stdcall glCreateShader(GLenum type)
1104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001105 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001106
1107 try
1108 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001109 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001110
1111 if (context)
1112 {
1113 switch (type)
1114 {
1115 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001116 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001117 return context->createShader(type);
1118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001120 }
1121 }
1122 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001123 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001125 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 }
1127
1128 return 0;
1129}
1130
1131void __stdcall glCullFace(GLenum mode)
1132{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001133 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134
1135 try
1136 {
1137 switch (mode)
1138 {
1139 case GL_FRONT:
1140 case GL_BACK:
1141 case GL_FRONT_AND_BACK:
1142 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144
1145 if (context)
1146 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001147 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001148 }
1149 }
1150 break;
1151 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001152 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 }
1154 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001155 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 }
1159}
1160
1161void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001163 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001164
1165 try
1166 {
1167 if (n < 0)
1168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001170 }
1171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173
1174 if (context)
1175 {
1176 for (int i = 0; i < n; i++)
1177 {
1178 context->deleteBuffer(buffers[i]);
1179 }
1180 }
1181 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001182 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 }
1186}
1187
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001188void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001190 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001191
1192 try
1193 {
1194 if (n < 0)
1195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001196 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001197 }
1198
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001199 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001200
1201 if (context)
1202 {
1203 for (int i = 0; i < n; i++)
1204 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001205 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001206 }
1207 }
1208 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001209 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001211 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001212 }
1213}
1214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001215void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001217 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001218
1219 try
1220 {
1221 if (n < 0)
1222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001224 }
1225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001227
1228 if (context)
1229 {
1230 for (int i = 0; i < n; i++)
1231 {
1232 if (framebuffers[i] != 0)
1233 {
1234 context->deleteFramebuffer(framebuffers[i]);
1235 }
1236 }
1237 }
1238 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001239 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243}
1244
1245void __stdcall glDeleteProgram(GLuint program)
1246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001247 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248
1249 try
1250 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001251 if (program == 0)
1252 {
1253 return;
1254 }
1255
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257
1258 if (context)
1259 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001260 if (!context->getProgram(program))
1261 {
1262 if(context->getShader(program))
1263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001265 }
1266 else
1267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001269 }
1270 }
1271
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272 context->deleteProgram(program);
1273 }
1274 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001275 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 }
1279}
1280
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001281void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1282{
1283 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1284
1285 try
1286 {
1287 if (n < 0)
1288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001290 }
1291
1292 gl::Context *context = gl::getNonLostContext();
1293
1294 if (context)
1295 {
1296 for (int i = 0; i < n; i++)
1297 {
1298 context->deleteQuery(ids[i]);
1299 }
1300 }
1301 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001302 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001305 }
1306}
1307
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1309{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001310 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001311
1312 try
1313 {
1314 if (n < 0)
1315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001317 }
1318
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001319 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001320
1321 if (context)
1322 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001323 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001324 {
1325 context->deleteRenderbuffer(renderbuffers[i]);
1326 }
1327 }
1328 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001329 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 }
1333}
1334
1335void __stdcall glDeleteShader(GLuint shader)
1336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001337 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338
1339 try
1340 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001341 if (shader == 0)
1342 {
1343 return;
1344 }
1345
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001346 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347
1348 if (context)
1349 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001350 if (!context->getShader(shader))
1351 {
1352 if(context->getProgram(shader))
1353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001354 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001355 }
1356 else
1357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001358 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001359 }
1360 }
1361
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001362 context->deleteShader(shader);
1363 }
1364 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001365 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001368 }
1369}
1370
1371void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001373 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001374
1375 try
1376 {
1377 if (n < 0)
1378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001380 }
1381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001383
1384 if (context)
1385 {
1386 for (int i = 0; i < n; i++)
1387 {
1388 if (textures[i] != 0)
1389 {
1390 context->deleteTexture(textures[i]);
1391 }
1392 }
1393 }
1394 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001395 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398 }
1399}
1400
1401void __stdcall glDepthFunc(GLenum func)
1402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001403 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001404
1405 try
1406 {
1407 switch (func)
1408 {
1409 case GL_NEVER:
1410 case GL_ALWAYS:
1411 case GL_LESS:
1412 case GL_LEQUAL:
1413 case GL_EQUAL:
1414 case GL_GREATER:
1415 case GL_GEQUAL:
1416 case GL_NOTEQUAL:
1417 break;
1418 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420 }
1421
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001422 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001423
1424 if (context)
1425 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001426 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427 }
1428 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001429 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 }
1433}
1434
1435void __stdcall glDepthMask(GLboolean flag)
1436{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001437 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001438
1439 try
1440 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442
1443 if (context)
1444 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001445 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446 }
1447 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001448 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451 }
1452}
1453
1454void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001456 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001457
1458 try
1459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461
1462 if (context)
1463 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001464 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465 }
1466 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001467 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 }
1471}
1472
1473void __stdcall glDetachShader(GLuint program, GLuint shader)
1474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001475 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001476
1477 try
1478 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001480
1481 if (context)
1482 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 gl::Program *programObject = context->getProgram(program);
1485 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001486
1487 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001488 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001489 gl::Shader *shaderByProgramHandle;
1490 shaderByProgramHandle = context->getShader(program);
1491 if (!shaderByProgramHandle)
1492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001494 }
1495 else
1496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001498 }
1499 }
1500
1501 if (!shaderObject)
1502 {
1503 gl::Program *programByShaderHandle = context->getProgram(shader);
1504 if (!programByShaderHandle)
1505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001506 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001507 }
1508 else
1509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001511 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001512 }
1513
1514 if (!programObject->detachShader(shaderObject))
1515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518 }
1519 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001520 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001522 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 }
1524}
1525
1526void __stdcall glDisable(GLenum cap)
1527{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001528 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001529
1530 try
1531 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001532 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533
1534 if (context)
1535 {
Geoff Lang0550d032014-01-30 11:29:07 -05001536 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539 }
Geoff Lang0550d032014-01-30 11:29:07 -05001540
1541 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001542 }
1543 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001544 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547 }
1548}
1549
1550void __stdcall glDisableVertexAttribArray(GLuint index)
1551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001552 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553
1554 try
1555 {
1556 if (index >= gl::MAX_VERTEX_ATTRIBS)
1557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559 }
1560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562
1563 if (context)
1564 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001565 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566 }
1567 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001568 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 }
1572}
1573
1574void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001576 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577
1578 try
1579 {
1580 if (count < 0 || first < 0)
1581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001582 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583 }
1584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586
Jamie Madill7a5f7382014-03-05 15:01:24 -05001587 // Check for mapped buffers
1588 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1589 {
1590 return gl::error(GL_INVALID_OPERATION);
1591 }
1592
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 if (context)
1594 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001595 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1596 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1597 curTransformFeedback->getDrawMode() != mode)
1598 {
1599 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1600 // that does not match the current transform feedback object's draw mode (if transform feedback
1601 // is active), (3.0.2, section 2.14, pg 86)
1602 return gl::error(GL_INVALID_OPERATION);
1603 }
1604
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001605 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001606 }
1607 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001608 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001610 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 }
1612}
1613
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001614void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1615{
1616 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1617
1618 try
1619 {
1620 if (count < 0 || first < 0 || primcount < 0)
1621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001623 }
1624
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001625 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001626 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001627 gl::Context *context = gl::getNonLostContext();
1628
Jamie Madill7a5f7382014-03-05 15:01:24 -05001629 // Check for mapped buffers
1630 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1631 {
1632 return gl::error(GL_INVALID_OPERATION);
1633 }
1634
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001635 if (context)
1636 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001637 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1638 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1639 curTransformFeedback->getDrawMode() != mode)
1640 {
1641 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1642 // that does not match the current transform feedback object's draw mode (if transform feedback
1643 // is active), (3.0.2, section 2.14, pg 86)
1644 return gl::error(GL_INVALID_OPERATION);
1645 }
1646
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001647 context->drawArrays(mode, first, count, primcount);
1648 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001649 }
1650 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001651 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001654 }
1655}
1656
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001657void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001659 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 +00001660 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 try
1663 {
1664 if (count < 0)
1665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001667 }
1668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670
1671 if (context)
1672 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001673 switch (type)
1674 {
1675 case GL_UNSIGNED_BYTE:
1676 case GL_UNSIGNED_SHORT:
1677 break;
1678 case GL_UNSIGNED_INT:
1679 if (!context->supports32bitIndices())
1680 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001682 }
1683 break;
1684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001686 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001687
1688 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1689 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1690 {
1691 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1692 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1693 return gl::error(GL_INVALID_OPERATION);
1694 }
1695
Jamie Madill7a5f7382014-03-05 15:01:24 -05001696 // Check for mapped buffers
1697 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1698 {
1699 return gl::error(GL_INVALID_OPERATION);
1700 }
1701
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001702 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703 }
1704 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001705 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001707 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708 }
1709}
1710
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001711void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1712{
1713 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1714 mode, count, type, indices, primcount);
1715
1716 try
1717 {
1718 if (count < 0 || primcount < 0)
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001721 }
1722
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001723 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001724 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001725 gl::Context *context = gl::getNonLostContext();
1726
1727 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001728 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001729 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001730 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001731 case GL_UNSIGNED_BYTE:
1732 case GL_UNSIGNED_SHORT:
1733 break;
1734 case GL_UNSIGNED_INT:
1735 if (!context->supports32bitIndices())
1736 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001738 }
1739 break;
1740 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001741 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001742 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001743
1744 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1745 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1746 {
1747 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1748 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1749 return gl::error(GL_INVALID_OPERATION);
1750 }
1751
Jamie Madill7a5f7382014-03-05 15:01:24 -05001752 // Check for mapped buffers
1753 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1754 {
1755 return gl::error(GL_INVALID_OPERATION);
1756 }
1757
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001758 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001760 }
1761 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001762 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001764 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001765 }
1766}
1767
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768void __stdcall glEnable(GLenum cap)
1769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001770 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001771
1772 try
1773 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775
1776 if (context)
1777 {
Geoff Lang0550d032014-01-30 11:29:07 -05001778 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001780 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001781 }
Geoff Lang0550d032014-01-30 11:29:07 -05001782
1783 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784 }
1785 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001786 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 }
1790}
1791
1792void __stdcall glEnableVertexAttribArray(GLuint index)
1793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001794 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795
1796 try
1797 {
1798 if (index >= gl::MAX_VERTEX_ATTRIBS)
1799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801 }
1802
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001803 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001804
1805 if (context)
1806 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001807 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001808 }
1809 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001810 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814}
1815
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001816void __stdcall glEndQueryEXT(GLenum target)
1817{
1818 EVENT("GLenum target = 0x%X)", target);
1819
1820 try
1821 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001822 gl::Context *context = gl::getNonLostContext();
1823
1824 if (context)
1825 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001826 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001827 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001828 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001829 }
1830
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001831 context->endQuery(target);
1832 }
1833 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001834 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001837 }
1838}
1839
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001840void __stdcall glFinishFenceNV(GLuint fence)
1841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001842 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001843
1844 try
1845 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001846 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001847
1848 if (context)
1849 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001850 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001851
1852 if (fenceObject == NULL)
1853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001854 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001855 }
1856
Jamie Madillfb9a7402013-07-26 11:55:01 -04001857 if (fenceObject->isFence() != GL_TRUE)
1858 {
1859 return gl::error(GL_INVALID_OPERATION);
1860 }
1861
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001862 fenceObject->finishFence();
1863 }
1864 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001865 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001867 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001868 }
1869}
1870
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871void __stdcall glFinish(void)
1872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001873 EVENT("()");
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
1879 if (context)
1880 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001881 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882 }
1883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001884 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001886 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001887 }
1888}
1889
1890void __stdcall glFlush(void)
1891{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001892 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893
1894 try
1895 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001896 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897
1898 if (context)
1899 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001900 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001901 }
1902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001903 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 }
1907}
1908
1909void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001911 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001912 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001913
1914 try
1915 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001916 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001918 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919 }
1920
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922
1923 if (context)
1924 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001925 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001926 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001927 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001928 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001929
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001930 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1931 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001932
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001933 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001935 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001936 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001937 }
1938 else
1939 {
1940 switch (attachment)
1941 {
1942 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001943 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001944 break;
1945 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001946 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001947 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001949 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1950 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001951 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001952 UNREACHABLE();
1953 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955 }
1956 }
1957 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001958 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961 }
1962}
1963
1964void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001966 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001967 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968
1969 try
1970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 if (context)
1973 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001974 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001975 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001976 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001977 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001978 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001979
1980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001981 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001982 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001983 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001984 }
1985
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001986 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001988 textarget = GL_NONE;
1989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001991 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001993 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001994 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001995 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001996 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001997 }
1998 else
1999 {
2000 switch (attachment)
2001 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002002 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2003 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2004 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002005 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002006 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007 }
2008 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002009 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002012 }
2013}
2014
2015void __stdcall glFrontFace(GLenum mode)
2016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002017 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018
2019 try
2020 {
2021 switch (mode)
2022 {
2023 case GL_CW:
2024 case GL_CCW:
2025 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002026 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027
2028 if (context)
2029 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002030 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 }
2032 }
2033 break;
2034 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002038 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002040 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041 }
2042}
2043
2044void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002046 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047
2048 try
2049 {
2050 if (n < 0)
2051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002052 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002055 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056
2057 if (context)
2058 {
2059 for (int i = 0; i < n; i++)
2060 {
2061 buffers[i] = context->createBuffer();
2062 }
2063 }
2064 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002065 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069}
2070
2071void __stdcall glGenerateMipmap(GLenum target)
2072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002073 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074
2075 try
2076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002078
2079 if (context)
2080 {
Jamie Madill35d15012013-10-07 10:46:37 -04002081 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002084 }
Geoff Langae4852a2013-06-05 15:00:34 -04002085
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002086 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002087
2088 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002089 {
2090 return gl::error(GL_INVALID_OPERATION);
2091 }
2092
Geoff Lang005df412013-10-16 14:12:50 -04002093 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002094
Geoff Langae4852a2013-06-05 15:00:34 -04002095 // Internally, all texture formats are sized so checking if the format
2096 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002097
2098 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2099 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2100
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002101 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2102 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002103 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2104 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002105 {
2106 return gl::error(GL_INVALID_OPERATION);
2107 }
2108
Jamie Madillc1f8b162013-10-07 10:46:38 -04002109 // Non-power of 2 ES2 check
2110 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2111 {
2112 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2113 return gl::error(GL_INVALID_OPERATION);
2114 }
2115
2116 // Cube completeness check
2117 if (target == GL_TEXTURE_CUBE_MAP)
2118 {
2119 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2120 if (!textureCube->isCubeComplete())
2121 {
2122 return gl::error(GL_INVALID_OPERATION);
2123 }
2124 }
2125
Geoff Langae4852a2013-06-05 15:00:34 -04002126 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002129 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132 }
2133}
2134
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002135void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002137 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002138
2139 try
2140 {
2141 if (n < 0)
2142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002144 }
2145
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002146 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002147
2148 if (context)
2149 {
2150 for (int i = 0; i < n; i++)
2151 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002152 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002153 }
2154 }
2155 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002156 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002158 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002159 }
2160}
2161
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002164 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165
2166 try
2167 {
2168 if (n < 0)
2169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174
2175 if (context)
2176 {
2177 for (int i = 0; i < n; i++)
2178 {
2179 framebuffers[i] = context->createFramebuffer();
2180 }
2181 }
2182 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002183 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186 }
2187}
2188
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002189void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2190{
2191 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2192
2193 try
2194 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002195 gl::Context *context = gl::getNonLostContext();
2196
2197 if (context)
2198 {
Geoff Lang37dde692014-01-31 16:34:54 -05002199 if (n < 0)
2200 {
2201 return gl::error(GL_INVALID_VALUE);
2202 }
2203
2204 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002205 {
2206 ids[i] = context->createQuery();
2207 }
2208 }
2209 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002210 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002212 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002213 }
2214}
2215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002218 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002219
2220 try
2221 {
2222 if (n < 0)
2223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225 }
2226
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228
2229 if (context)
2230 {
2231 for (int i = 0; i < n; i++)
2232 {
2233 renderbuffers[i] = context->createRenderbuffer();
2234 }
2235 }
2236 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002237 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240 }
2241}
2242
2243void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2244{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002245 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246
2247 try
2248 {
2249 if (n < 0)
2250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002251 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252 }
2253
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255
2256 if (context)
2257 {
2258 for (int i = 0; i < n; i++)
2259 {
2260 textures[i] = context->createTexture();
2261 }
2262 }
2263 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002264 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002267 }
2268}
2269
daniel@transgaming.com85423182010-04-22 13:35:27 +00002270void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002272 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002273 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 program, index, bufsize, length, size, type, name);
2275
2276 try
2277 {
2278 if (bufsize < 0)
2279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281 }
2282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002284
2285 if (context)
2286 {
2287 gl::Program *programObject = context->getProgram(program);
2288
2289 if (!programObject)
2290 {
2291 if (context->getShader(program))
2292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002293 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002294 }
2295 else
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002298 }
2299 }
2300
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002301 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002304 }
2305
2306 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2307 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002308 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002309 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 }
2313}
2314
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002315void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002316{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002317 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002318 "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 +00002319 program, index, bufsize, length, size, type, name);
2320
2321 try
2322 {
2323 if (bufsize < 0)
2324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 }
2327
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002329
2330 if (context)
2331 {
2332 gl::Program *programObject = context->getProgram(program);
2333
2334 if (!programObject)
2335 {
2336 if (context->getShader(program))
2337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002338 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002339 }
2340 else
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002343 }
2344 }
2345
2346 if (index >= (GLuint)programObject->getActiveUniformCount())
2347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002349 }
2350
2351 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002354 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358}
2359
2360void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002362 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 +00002363 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 try
2366 {
2367 if (maxcount < 0)
2368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
2371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002373
2374 if (context)
2375 {
2376 gl::Program *programObject = context->getProgram(program);
2377
2378 if (!programObject)
2379 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002380 if (context->getShader(program))
2381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002382 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002383 }
2384 else
2385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002387 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002388 }
2389
2390 return programObject->getAttachedShaders(maxcount, count, shaders);
2391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002393 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002399int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402
2403 try
2404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002405 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406
2407 if (context)
2408 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002409
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 gl::Program *programObject = context->getProgram(program);
2411
2412 if (!programObject)
2413 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002414 if (context->getShader(program))
2415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002416 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002417 }
2418 else
2419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002421 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002422 }
2423
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002424 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002425 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002427 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002428 }
2429
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002430 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 }
2432 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002433 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002435 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 }
2437
2438 return -1;
2439}
2440
2441void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002443 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444
2445 try
2446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002448
2449 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002450 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002451 GLenum nativeType;
2452 unsigned int numParams = 0;
2453 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2454 return gl::error(GL_INVALID_ENUM);
2455
2456 // pname is valid, but there are no parameters to return
2457 if (numParams == 0)
2458 return;
2459
2460 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002461 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002462 context->getBooleanv(pname, params);
2463 }
Jamie Madill55856b12014-01-02 13:59:50 -05002464 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002465 {
Jamie Madill55856b12014-01-02 13:59:50 -05002466 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002467 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 }
2469 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002470 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002472 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002473 }
2474}
2475
2476void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002478 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 +00002479
2480 try
2481 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002483
2484 if (context)
2485 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002486 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002487 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002488 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002489 }
2490
Jamie Madill70656a62014-03-05 15:01:26 -05002491 if (!gl::ValidBufferParameter(context, pname))
2492 {
2493 return gl::error(GL_INVALID_ENUM);
2494 }
2495
Jamie Madill8c96d582014-03-05 15:01:23 -05002496 gl::Buffer *buffer = context->getTargetBuffer(target);
2497
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002498 if (!buffer)
2499 {
2500 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002501 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002502 }
2503
2504 switch (pname)
2505 {
2506 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002507 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002508 break;
2509 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002510 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002511 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002512 case GL_BUFFER_ACCESS_FLAGS:
2513 *params = buffer->accessFlags();
2514 break;
2515 case GL_BUFFER_MAPPED:
2516 *params = static_cast<GLint>(buffer->mapped());
2517 break;
2518 case GL_BUFFER_MAP_OFFSET:
2519 *params = gl::clampCast<GLint>(buffer->mapOffset());
2520 break;
2521 case GL_BUFFER_MAP_LENGTH:
2522 *params = gl::clampCast<GLint>(buffer->mapLength());
2523 break;
2524 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002525 }
2526 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002528 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002530 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
2532}
2533
2534GLenum __stdcall glGetError(void)
2535{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002536 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002537
2538 gl::Context *context = gl::getContext();
2539
2540 if (context)
2541 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002542 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002543 }
2544
2545 return GL_NO_ERROR;
2546}
2547
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002548void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002550 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002551
2552 try
2553 {
2554
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002555 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002556
2557 if (context)
2558 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002559 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002560
2561 if (fenceObject == NULL)
2562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002563 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002564 }
2565
Jamie Madillfb9a7402013-07-26 11:55:01 -04002566 if (fenceObject->isFence() != GL_TRUE)
2567 {
2568 return gl::error(GL_INVALID_OPERATION);
2569 }
2570
2571 switch (pname)
2572 {
2573 case GL_FENCE_STATUS_NV:
2574 case GL_FENCE_CONDITION_NV:
2575 break;
2576
2577 default: return gl::error(GL_INVALID_ENUM);
2578 }
2579
2580 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002581 }
2582 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002583 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002585 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002586 }
2587}
2588
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002589void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002591 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592
2593 try
2594 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002596
2597 if (context)
2598 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002599 GLenum nativeType;
2600 unsigned int numParams = 0;
2601 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2602 return gl::error(GL_INVALID_ENUM);
2603
2604 // pname is valid, but that there are no parameters to return.
2605 if (numParams == 0)
2606 return;
2607
2608 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002609 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002610 context->getFloatv(pname, params);
2611 }
Jamie Madill55856b12014-01-02 13:59:50 -05002612 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002613 {
Jamie Madill55856b12014-01-02 13:59:50 -05002614 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002615 }
2616 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002617 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002618 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002621 }
2622}
2623
2624void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002626 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 +00002627 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628
2629 try
2630 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002631 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002632
2633 if (context)
2634 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002635 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002638 }
2639
Geoff Lang646559f2013-08-15 11:08:15 -04002640 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002641 {
Geoff Lang646559f2013-08-15 11:08:15 -04002642 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2643 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2644 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2645 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2646 break;
2647 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2651 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2652 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2653 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2654 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2655 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2656 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002657 {
Geoff Lang646559f2013-08-15 11:08:15 -04002658 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002659 }
Geoff Lang646559f2013-08-15 11:08:15 -04002660 default:
2661 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002662 }
Geoff Lang646559f2013-08-15 11:08:15 -04002663
2664 // Determine if the attachment is a valid enum
2665 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002666 {
Geoff Lang646559f2013-08-15 11:08:15 -04002667 case GL_BACK:
2668 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002669 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002670 case GL_STENCIL:
2671 case GL_DEPTH_STENCIL_ATTACHMENT:
2672 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002673 {
Geoff Lang646559f2013-08-15 11:08:15 -04002674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002675 }
Geoff Lang646559f2013-08-15 11:08:15 -04002676 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002677
Geoff Lang646559f2013-08-15 11:08:15 -04002678 case GL_DEPTH_ATTACHMENT:
2679 case GL_STENCIL_ATTACHMENT:
2680 break;
2681
2682 default:
2683 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2684 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2685 {
2686 return gl::error(GL_INVALID_ENUM);
2687 }
2688 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002689 }
2690
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002691 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2692 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002693 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2694
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002695 GLenum attachmentType;
2696 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002697 GLuint attachmentLevel;
2698 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002699 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002700
Geoff Lang646559f2013-08-15 11:08:15 -04002701 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002702 {
Geoff Lang646559f2013-08-15 11:08:15 -04002703 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002704 {
Geoff Lang646559f2013-08-15 11:08:15 -04002705 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002706 }
2707
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002708 switch (attachment)
2709 {
Geoff Lang646559f2013-08-15 11:08:15 -04002710 case GL_BACK:
2711 attachmentType = framebuffer->getColorbufferType(0);
2712 attachmentHandle = framebuffer->getColorbufferHandle(0);
2713 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2714 attachmentLayer = framebuffer->getColorbufferLayer(0);
2715 renderbuffer = framebuffer->getColorbuffer(0);
2716 break;
2717 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002718 attachmentType = framebuffer->getDepthbufferType();
2719 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002720 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2721 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002722 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002723 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002724 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002725 attachmentType = framebuffer->getStencilbufferType();
2726 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002727 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2728 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002729 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002730 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002731 default:
2732 return gl::error(GL_INVALID_OPERATION);
2733 }
2734 }
2735 else
2736 {
2737 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2738 {
2739 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2740 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2741 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2742 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2743 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2744 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2745 }
2746 else
2747 {
2748 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002749 {
Geoff Lang646559f2013-08-15 11:08:15 -04002750 case GL_DEPTH_ATTACHMENT:
2751 attachmentType = framebuffer->getDepthbufferType();
2752 attachmentHandle = framebuffer->getDepthbufferHandle();
2753 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2754 attachmentLayer = framebuffer->getDepthbufferLayer();
2755 renderbuffer = framebuffer->getDepthbuffer();
2756 break;
2757 case GL_STENCIL_ATTACHMENT:
2758 attachmentType = framebuffer->getStencilbufferType();
2759 attachmentHandle = framebuffer->getStencilbufferHandle();
2760 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2761 attachmentLayer = framebuffer->getStencilbufferLayer();
2762 renderbuffer = framebuffer->getStencilbuffer();
2763 break;
2764 case GL_DEPTH_STENCIL_ATTACHMENT:
2765 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2766 {
2767 return gl::error(GL_INVALID_OPERATION);
2768 }
2769 attachmentType = framebuffer->getDepthStencilbufferType();
2770 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2771 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2772 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2773 renderbuffer = framebuffer->getDepthStencilBuffer();
2774 break;
2775 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002776 return gl::error(GL_INVALID_OPERATION);
2777 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002778 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002779 }
2780
2781 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002782 if (framebufferHandle == 0)
2783 {
2784 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2785 }
2786 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002787 {
2788 attachmentObjectType = attachmentType;
2789 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002790 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002791 {
2792 attachmentObjectType = GL_TEXTURE;
2793 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002794 else
2795 {
2796 UNREACHABLE();
2797 return;
2798 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002799
Geoff Lang646559f2013-08-15 11:08:15 -04002800 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002801 {
Geoff Lang646559f2013-08-15 11:08:15 -04002802 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2803 // is NONE, then querying any other pname will generate INVALID_ENUM.
2804
2805 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2806 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2807 // INVALID_OPERATION for all other pnames
2808
2809 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002810 {
Geoff Lang646559f2013-08-15 11:08:15 -04002811 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2812 *params = attachmentObjectType;
2813 break;
2814
2815 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2816 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002817 {
Geoff Lang646559f2013-08-15 11:08:15 -04002818 return gl::error(GL_INVALID_ENUM);
2819 }
2820 *params = 0;
2821 break;
2822
2823 default:
2824 if (context->getClientVersion() < 3)
2825 {
2826 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002827 }
2828 else
2829 {
Geoff Lang646559f2013-08-15 11:08:15 -04002830 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002831 }
2832 }
Geoff Lang646559f2013-08-15 11:08:15 -04002833 }
2834 else
2835 {
2836 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2837 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2838 ASSERT(renderbuffer != NULL);
2839
2840 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002841 {
Geoff Lang646559f2013-08-15 11:08:15 -04002842 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2843 *params = attachmentObjectType;
2844 break;
2845
2846 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2847 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2848 {
2849 return gl::error(GL_INVALID_ENUM);
2850 }
2851 *params = attachmentHandle;
2852 break;
2853
2854 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2855 if (attachmentObjectType != GL_TEXTURE)
2856 {
2857 return gl::error(GL_INVALID_ENUM);
2858 }
2859 *params = attachmentLevel;
2860 break;
2861
2862 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2863 if (attachmentObjectType != GL_TEXTURE)
2864 {
2865 return gl::error(GL_INVALID_ENUM);
2866 }
2867 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2868 break;
2869
2870 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2871 *params = renderbuffer->getRedSize();
2872 break;
2873
2874 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2875 *params = renderbuffer->getGreenSize();
2876 break;
2877
2878 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2879 *params = renderbuffer->getBlueSize();
2880 break;
2881
2882 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2883 *params = renderbuffer->getAlphaSize();
2884 break;
2885
2886 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2887 *params = renderbuffer->getDepthSize();
2888 break;
2889
2890 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2891 *params = renderbuffer->getStencilSize();
2892 break;
2893
2894 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2895 if (attachment == GL_DEPTH_STENCIL)
2896 {
2897 gl::error(GL_INVALID_OPERATION);
2898 }
2899 *params = renderbuffer->getComponentType();
2900 break;
2901
2902 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2903 *params = renderbuffer->getColorEncoding();
2904 break;
2905
2906 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2907 if (attachmentObjectType != GL_TEXTURE)
2908 {
2909 return gl::error(GL_INVALID_ENUM);
2910 }
2911 *params = attachmentLayer;
2912 break;
2913
2914 default:
2915 UNREACHABLE();
2916 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002917 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002918 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919 }
2920 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002921 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924 }
2925}
2926
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002927GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2928{
2929 EVENT("()");
2930
2931 try
2932 {
2933 gl::Context *context = gl::getContext();
2934
2935 if (context)
2936 {
2937 return context->getResetStatus();
2938 }
2939
2940 return GL_NO_ERROR;
2941 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002942 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002943 {
2944 return GL_OUT_OF_MEMORY;
2945 }
2946}
2947
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2949{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002950 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951
2952 try
2953 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002954 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002955
2956 if (context)
2957 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002958 GLenum nativeType;
2959 unsigned int numParams = 0;
2960 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2961 return gl::error(GL_INVALID_ENUM);
2962
2963 // pname is valid, but there are no parameters to return
2964 if (numParams == 0)
2965 return;
2966
2967 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002968 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002969 context->getIntegerv(pname, params);
2970 }
Jamie Madill55856b12014-01-02 13:59:50 -05002971 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002972 {
Jamie Madill55856b12014-01-02 13:59:50 -05002973 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002974 }
2975 }
2976 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002977 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002980 }
2981}
2982
2983void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002985 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002986
2987 try
2988 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002989 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002990
2991 if (context)
2992 {
2993 gl::Program *programObject = context->getProgram(program);
2994
2995 if (!programObject)
2996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002997 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002998 }
2999
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003000 if (context->getClientVersion() < 3)
3001 {
3002 switch (pname)
3003 {
3004 case GL_ACTIVE_UNIFORM_BLOCKS:
3005 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003006 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3007 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3008 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003009 return gl::error(GL_INVALID_ENUM);
3010 }
3011 }
3012
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 switch (pname)
3014 {
3015 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003016 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 return;
3018 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003019 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 return;
3021 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003022 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003023 return;
3024 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003025 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003026 return;
3027 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003028 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003029 return;
3030 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003031 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003032 return;
3033 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003034 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003035 return;
3036 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003037 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003038 return;
3039 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003040 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003041 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003042 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003043 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003044 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003045 case GL_ACTIVE_UNIFORM_BLOCKS:
3046 *params = programObject->getActiveUniformBlockCount();
3047 return;
3048 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3049 *params = programObject->getActiveUniformBlockMaxLength();
3050 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003051 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3052 *params = programObject->getTransformFeedbackBufferMode();
3053 break;
3054 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3055 *params = programObject->getTransformFeedbackVaryingCount();
3056 break;
3057 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3058 *params = programObject->getTransformFeedbackVaryingMaxLength();
3059 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003061 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003062 }
3063 }
3064 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003065 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003068 }
3069}
3070
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003071void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003073 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 +00003074 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003075
3076 try
3077 {
3078 if (bufsize < 0)
3079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003080 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 }
3082
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003084
3085 if (context)
3086 {
3087 gl::Program *programObject = context->getProgram(program);
3088
3089 if (!programObject)
3090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003092 }
3093
3094 programObject->getInfoLog(bufsize, length, infolog);
3095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003096 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003097 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003099 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003100 }
3101}
3102
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003103void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3104{
3105 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3106
3107 try
3108 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003109 gl::Context *context = gl::getNonLostContext();
3110
3111 if (context)
3112 {
Geoff Lang37dde692014-01-31 16:34:54 -05003113 if (!ValidQueryType(context, target))
3114 {
3115 return gl::error(GL_INVALID_ENUM);
3116 }
3117
3118 switch (pname)
3119 {
3120 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003121 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003122 break;
3123
3124 default:
3125 return gl::error(GL_INVALID_ENUM);
3126 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003127 }
3128 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003129 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003132 }
3133}
3134
3135void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3136{
3137 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3138
3139 try
3140 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003141 gl::Context *context = gl::getNonLostContext();
3142
3143 if (context)
3144 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003145 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3146
3147 if (!queryObject)
3148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003150 }
3151
Jamie Madill45c785d2014-05-13 14:09:34 -04003152 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003154 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003155 }
3156
3157 switch(pname)
3158 {
3159 case GL_QUERY_RESULT_EXT:
3160 params[0] = queryObject->getResult();
3161 break;
3162 case GL_QUERY_RESULT_AVAILABLE_EXT:
3163 params[0] = queryObject->isResultAvailable();
3164 break;
3165 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003166 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003167 }
3168 }
3169 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003170 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003172 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003173 }
3174}
3175
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003176void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003178 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 +00003179
3180 try
3181 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003182 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003183
3184 if (context)
3185 {
3186 if (target != GL_RENDERBUFFER)
3187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003188 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003189 }
3190
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003191 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003193 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003194 }
3195
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003196 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003197
3198 switch (pname)
3199 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003200 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3201 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3202 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3203 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3204 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3205 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3206 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3207 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3208 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003209 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003210 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003211 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003212 *params = renderbuffer->getSamples();
3213 }
3214 else
3215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003216 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003217 }
3218 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003221 }
3222 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003223 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003224 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003227 }
3228}
3229
3230void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003232 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003233
3234 try
3235 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003236 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237
3238 if (context)
3239 {
3240 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003241
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003242 if (!shaderObject)
3243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003244 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003245 }
3246
3247 switch (pname)
3248 {
3249 case GL_SHADER_TYPE:
3250 *params = shaderObject->getType();
3251 return;
3252 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003253 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254 return;
3255 case GL_COMPILE_STATUS:
3256 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3257 return;
3258 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003259 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003260 return;
3261 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003262 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003263 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003264 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3265 *params = shaderObject->getTranslatedSourceLength();
3266 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003268 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003269 }
3270 }
3271 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003272 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275 }
3276}
3277
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003278void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003280 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 +00003281 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282
3283 try
3284 {
3285 if (bufsize < 0)
3286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003288 }
3289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003291
3292 if (context)
3293 {
3294 gl::Shader *shaderObject = context->getShader(shader);
3295
3296 if (!shaderObject)
3297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003298 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003299 }
3300
3301 shaderObject->getInfoLog(bufsize, length, infolog);
3302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003304 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003307 }
3308}
3309
3310void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003312 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 +00003313 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003314
3315 try
3316 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003317 switch (shadertype)
3318 {
3319 case GL_VERTEX_SHADER:
3320 case GL_FRAGMENT_SHADER:
3321 break;
3322 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003323 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003324 }
3325
3326 switch (precisiontype)
3327 {
3328 case GL_LOW_FLOAT:
3329 case GL_MEDIUM_FLOAT:
3330 case GL_HIGH_FLOAT:
3331 // Assume IEEE 754 precision
3332 range[0] = 127;
3333 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003334 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003335 break;
3336 case GL_LOW_INT:
3337 case GL_MEDIUM_INT:
3338 case GL_HIGH_INT:
3339 // Some (most) hardware only supports single-precision floating-point numbers,
3340 // which can accurately represent integers up to +/-16777216
3341 range[0] = 24;
3342 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003343 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003344 break;
3345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003347 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003349 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352 }
3353}
3354
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003355void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003357 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 +00003358 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359
3360 try
3361 {
3362 if (bufsize < 0)
3363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003364 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003365 }
3366
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003368
3369 if (context)
3370 {
3371 gl::Shader *shaderObject = context->getShader(shader);
3372
3373 if (!shaderObject)
3374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003376 }
3377
3378 shaderObject->getSource(bufsize, length, source);
3379 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003380 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003381 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003384 }
3385}
3386
zmo@google.coma574f782011-10-03 21:45:23 +00003387void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3388{
3389 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3390 shader, bufsize, length, source);
3391
3392 try
3393 {
3394 if (bufsize < 0)
3395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003396 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003397 }
3398
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003399 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003400
3401 if (context)
3402 {
3403 gl::Shader *shaderObject = context->getShader(shader);
3404
3405 if (!shaderObject)
3406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003407 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003408 }
3409
3410 shaderObject->getTranslatedSource(bufsize, length, source);
3411 }
3412 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003413 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003415 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003416 }
3417}
3418
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003419const GLubyte* __stdcall glGetString(GLenum name)
3420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003421 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003422
3423 try
3424 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003426
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427 switch (name)
3428 {
3429 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003430 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003431 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003432 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003433 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003434 if (context->getClientVersion() == 2)
3435 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003436 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003437 }
3438 else
3439 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003440 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003441 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003443 if (context->getClientVersion() == 2)
3444 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003445 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003446 }
3447 else
3448 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003449 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003450 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003452 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003454 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455 }
3456 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003457 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003459 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461}
3462
3463void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3464{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003465 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 +00003466
3467 try
3468 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003470
3471 if (context)
3472 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003473 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003474
Jamie Madillfb8a8302013-07-03 14:24:12 -04003475 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003477 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003478 }
3479
3480 switch (pname)
3481 {
3482 case GL_TEXTURE_MAG_FILTER:
3483 *params = (GLfloat)texture->getMagFilter();
3484 break;
3485 case GL_TEXTURE_MIN_FILTER:
3486 *params = (GLfloat)texture->getMinFilter();
3487 break;
3488 case GL_TEXTURE_WRAP_S:
3489 *params = (GLfloat)texture->getWrapS();
3490 break;
3491 case GL_TEXTURE_WRAP_T:
3492 *params = (GLfloat)texture->getWrapT();
3493 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003494 case GL_TEXTURE_WRAP_R:
3495 if (context->getClientVersion() < 3)
3496 {
3497 return gl::error(GL_INVALID_ENUM);
3498 }
3499 *params = (GLfloat)texture->getWrapR();
3500 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003501 case GL_TEXTURE_IMMUTABLE_FORMAT:
3502 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003503 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3504 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003505 case GL_TEXTURE_IMMUTABLE_LEVELS:
3506 if (context->getClientVersion() < 3)
3507 {
3508 return gl::error(GL_INVALID_ENUM);
3509 }
Jamie Madill51a94372013-10-24 17:49:43 -04003510 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003511 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003512 case GL_TEXTURE_USAGE_ANGLE:
3513 *params = (GLfloat)texture->getUsage();
3514 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003515 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3516 if (!context->supportsTextureFilterAnisotropy())
3517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003519 }
3520 *params = (GLfloat)texture->getMaxAnisotropy();
3521 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003522 case GL_TEXTURE_SWIZZLE_R:
3523 if (context->getClientVersion() < 3)
3524 {
3525 return gl::error(GL_INVALID_ENUM);
3526 }
3527 *params = (GLfloat)texture->getSwizzleRed();
3528 break;
3529 case GL_TEXTURE_SWIZZLE_G:
3530 if (context->getClientVersion() < 3)
3531 {
3532 return gl::error(GL_INVALID_ENUM);
3533 }
3534 *params = (GLfloat)texture->getSwizzleGreen();
3535 break;
3536 case GL_TEXTURE_SWIZZLE_B:
3537 if (context->getClientVersion() < 3)
3538 {
3539 return gl::error(GL_INVALID_ENUM);
3540 }
3541 *params = (GLfloat)texture->getSwizzleBlue();
3542 break;
3543 case GL_TEXTURE_SWIZZLE_A:
3544 if (context->getClientVersion() < 3)
3545 {
3546 return gl::error(GL_INVALID_ENUM);
3547 }
3548 *params = (GLfloat)texture->getSwizzleAlpha();
3549 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003550 case GL_TEXTURE_BASE_LEVEL:
3551 if (context->getClientVersion() < 3)
3552 {
3553 return gl::error(GL_INVALID_ENUM);
3554 }
3555 *params = (GLfloat)texture->getBaseLevel();
3556 break;
3557 case GL_TEXTURE_MAX_LEVEL:
3558 if (context->getClientVersion() < 3)
3559 {
3560 return gl::error(GL_INVALID_ENUM);
3561 }
3562 *params = (GLfloat)texture->getMaxLevel();
3563 break;
3564 case GL_TEXTURE_MIN_LOD:
3565 if (context->getClientVersion() < 3)
3566 {
3567 return gl::error(GL_INVALID_ENUM);
3568 }
3569 *params = texture->getMinLod();
3570 break;
3571 case GL_TEXTURE_MAX_LOD:
3572 if (context->getClientVersion() < 3)
3573 {
3574 return gl::error(GL_INVALID_ENUM);
3575 }
3576 *params = texture->getMaxLod();
3577 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003578 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003580 }
3581 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003582 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003583 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586 }
3587}
3588
3589void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003591 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 +00003592
3593 try
3594 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003596
3597 if (context)
3598 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003599 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003600
Jamie Madillfb8a8302013-07-03 14:24:12 -04003601 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003603 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003604 }
3605
3606 switch (pname)
3607 {
3608 case GL_TEXTURE_MAG_FILTER:
3609 *params = texture->getMagFilter();
3610 break;
3611 case GL_TEXTURE_MIN_FILTER:
3612 *params = texture->getMinFilter();
3613 break;
3614 case GL_TEXTURE_WRAP_S:
3615 *params = texture->getWrapS();
3616 break;
3617 case GL_TEXTURE_WRAP_T:
3618 *params = texture->getWrapT();
3619 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003620 case GL_TEXTURE_WRAP_R:
3621 if (context->getClientVersion() < 3)
3622 {
3623 return gl::error(GL_INVALID_ENUM);
3624 }
3625 *params = texture->getWrapR();
3626 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003627 case GL_TEXTURE_IMMUTABLE_FORMAT:
3628 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003629 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3630 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003631 case GL_TEXTURE_IMMUTABLE_LEVELS:
3632 if (context->getClientVersion() < 3)
3633 {
3634 return gl::error(GL_INVALID_ENUM);
3635 }
Jamie Madill51a94372013-10-24 17:49:43 -04003636 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003637 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003638 case GL_TEXTURE_USAGE_ANGLE:
3639 *params = texture->getUsage();
3640 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003641 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3642 if (!context->supportsTextureFilterAnisotropy())
3643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003645 }
3646 *params = (GLint)texture->getMaxAnisotropy();
3647 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003648 case GL_TEXTURE_SWIZZLE_R:
3649 if (context->getClientVersion() < 3)
3650 {
3651 return gl::error(GL_INVALID_ENUM);
3652 }
3653 *params = texture->getSwizzleRed();
3654 break;
3655 case GL_TEXTURE_SWIZZLE_G:
3656 if (context->getClientVersion() < 3)
3657 {
3658 return gl::error(GL_INVALID_ENUM);
3659 }
3660 *params = texture->getSwizzleGreen();
3661 break;
3662 case GL_TEXTURE_SWIZZLE_B:
3663 if (context->getClientVersion() < 3)
3664 {
3665 return gl::error(GL_INVALID_ENUM);
3666 }
3667 *params = texture->getSwizzleBlue();
3668 break;
3669 case GL_TEXTURE_SWIZZLE_A:
3670 if (context->getClientVersion() < 3)
3671 {
3672 return gl::error(GL_INVALID_ENUM);
3673 }
3674 *params = texture->getSwizzleAlpha();
3675 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003676 case GL_TEXTURE_BASE_LEVEL:
3677 if (context->getClientVersion() < 3)
3678 {
3679 return gl::error(GL_INVALID_ENUM);
3680 }
3681 *params = texture->getBaseLevel();
3682 break;
3683 case GL_TEXTURE_MAX_LEVEL:
3684 if (context->getClientVersion() < 3)
3685 {
3686 return gl::error(GL_INVALID_ENUM);
3687 }
3688 *params = texture->getMaxLevel();
3689 break;
3690 case GL_TEXTURE_MIN_LOD:
3691 if (context->getClientVersion() < 3)
3692 {
3693 return gl::error(GL_INVALID_ENUM);
3694 }
3695 *params = (GLint)texture->getMinLod();
3696 break;
3697 case GL_TEXTURE_MAX_LOD:
3698 if (context->getClientVersion() < 3)
3699 {
3700 return gl::error(GL_INVALID_ENUM);
3701 }
3702 *params = (GLint)texture->getMaxLod();
3703 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003704 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003706 }
3707 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003708 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003709 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003711 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003712 }
3713}
3714
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003715void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3716{
3717 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3718 program, location, bufSize, params);
3719
3720 try
3721 {
3722 if (bufSize < 0)
3723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003725 }
3726
3727 gl::Context *context = gl::getNonLostContext();
3728
3729 if (context)
3730 {
3731 if (program == 0)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003734 }
3735
3736 gl::Program *programObject = context->getProgram(program);
3737
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003738 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003740 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003741 }
3742
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003743 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3744 if (!programBinary)
3745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003746 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003747 }
3748
3749 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003751 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003752 }
3753 }
3754 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003755 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003757 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003758 }
3759}
3760
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003761void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3762{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003763 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003764
3765 try
3766 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003767 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003768
3769 if (context)
3770 {
3771 if (program == 0)
3772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003773 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003774 }
3775
3776 gl::Program *programObject = context->getProgram(program);
3777
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003778 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003780 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003781 }
3782
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003783 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3784 if (!programBinary)
3785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003786 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003787 }
3788
3789 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003791 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003792 }
3793 }
3794 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003795 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003798 }
3799}
3800
3801void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3802{
3803 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3804 program, location, bufSize, params);
3805
3806 try
3807 {
3808 if (bufSize < 0)
3809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003811 }
3812
3813 gl::Context *context = gl::getNonLostContext();
3814
3815 if (context)
3816 {
3817 if (program == 0)
3818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003819 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003820 }
3821
3822 gl::Program *programObject = context->getProgram(program);
3823
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003824 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003826 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003827 }
3828
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003829 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3830 if (!programBinary)
3831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003832 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003833 }
3834
3835 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003837 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003838 }
3839 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003840 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003841 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003844 }
3845}
3846
3847void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003849 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003850
3851 try
3852 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003854
3855 if (context)
3856 {
3857 if (program == 0)
3858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003859 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003860 }
3861
3862 gl::Program *programObject = context->getProgram(program);
3863
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003864 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003866 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003867 }
3868
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003869 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3870 if (!programBinary)
3871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003873 }
3874
3875 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003877 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003878 }
3879 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003881 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003883 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003884 }
3885}
3886
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003887int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003888{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003889 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003890
3891 try
3892 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003893 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003894
3895 if (strstr(name, "gl_") == name)
3896 {
3897 return -1;
3898 }
3899
3900 if (context)
3901 {
3902 gl::Program *programObject = context->getProgram(program);
3903
3904 if (!programObject)
3905 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003906 if (context->getShader(program))
3907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003908 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003909 }
3910 else
3911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003912 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003913 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914 }
3915
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003916 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003917 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003919 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003920 }
3921
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003922 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923 }
3924 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003925 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003927 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 }
3929
3930 return -1;
3931}
3932
3933void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003935 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936
3937 try
3938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940
daniel@transgaming.come0078962010-04-15 20:45:08 +00003941 if (context)
3942 {
3943 if (index >= gl::MAX_VERTEX_ATTRIBS)
3944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003945 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003946 }
3947
daniel@transgaming.com83921382011-01-08 05:46:00 +00003948 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003949
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003950 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003951 {
Jamie Madillaff71502013-07-02 11:57:05 -04003952 return;
3953 }
3954
3955 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3956 {
3957 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3958 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003959 {
Jamie Madillaff71502013-07-02 11:57:05 -04003960 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003961 }
Jamie Madillaff71502013-07-02 11:57:05 -04003962 }
3963 else
3964 {
3965 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003966 }
3967 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003968 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003969 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003972 }
3973}
3974
3975void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003977 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978
3979 try
3980 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003981 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003982
daniel@transgaming.come0078962010-04-15 20:45:08 +00003983 if (context)
3984 {
3985 if (index >= gl::MAX_VERTEX_ATTRIBS)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003988 }
3989
daniel@transgaming.com83921382011-01-08 05:46:00 +00003990 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003991
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003992 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003993 {
Jamie Madillaff71502013-07-02 11:57:05 -04003994 return;
3995 }
3996
3997 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3998 {
3999 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
4000 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00004001 {
Jamie Madillaff71502013-07-02 11:57:05 -04004002 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04004003 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004004 }
Jamie Madillaff71502013-07-02 11:57:05 -04004005 }
4006 else
4007 {
4008 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004009 }
4010 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004011 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004012 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004015 }
4016}
4017
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004018void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004020 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021
4022 try
4023 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004024 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004025
daniel@transgaming.come0078962010-04-15 20:45:08 +00004026 if (context)
4027 {
4028 if (index >= gl::MAX_VERTEX_ATTRIBS)
4029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004031 }
4032
4033 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004036 }
4037
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004038 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004039 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004040 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004041 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 }
4045}
4046
4047void __stdcall glHint(GLenum target, GLenum mode)
4048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004049 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004050
4051 try
4052 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004053 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004054 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004055 case GL_FASTEST:
4056 case GL_NICEST:
4057 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004058 break;
4059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004061 }
4062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004063 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004064 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004065 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004066 case GL_GENERATE_MIPMAP_HINT:
4067 if (context) context->setGenerateMipmapHint(mode);
4068 break;
4069 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4070 if (context) context->setFragmentShaderDerivativeHint(mode);
4071 break;
4072 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004074 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004076 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004079 }
4080}
4081
4082GLboolean __stdcall glIsBuffer(GLuint buffer)
4083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004084 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004085
4086 try
4087 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004089
4090 if (context && buffer)
4091 {
4092 gl::Buffer *bufferObject = context->getBuffer(buffer);
4093
4094 if (bufferObject)
4095 {
4096 return GL_TRUE;
4097 }
4098 }
4099 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004100 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004102 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 }
4104
4105 return GL_FALSE;
4106}
4107
4108GLboolean __stdcall glIsEnabled(GLenum cap)
4109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004110 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111
4112 try
4113 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004114 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115
4116 if (context)
4117 {
Geoff Lang0550d032014-01-30 11:29:07 -05004118 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004120 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004121 }
Geoff Lang0550d032014-01-30 11:29:07 -05004122
4123 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 }
4125 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004126 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129 }
4130
4131 return false;
4132}
4133
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004134GLboolean __stdcall glIsFenceNV(GLuint fence)
4135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004136 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004137
4138 try
4139 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004140 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004141
4142 if (context)
4143 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004144 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004145
4146 if (fenceObject == NULL)
4147 {
4148 return GL_FALSE;
4149 }
4150
4151 return fenceObject->isFence();
4152 }
4153 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004154 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004156 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004157 }
4158
4159 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004160}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004161
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004162GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004164 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004165
4166 try
4167 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004168 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004169
4170 if (context && framebuffer)
4171 {
4172 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4173
4174 if (framebufferObject)
4175 {
4176 return GL_TRUE;
4177 }
4178 }
4179 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004180 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004182 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004183 }
4184
4185 return GL_FALSE;
4186}
4187
4188GLboolean __stdcall glIsProgram(GLuint program)
4189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004190 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004191
4192 try
4193 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004194 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004195
4196 if (context && program)
4197 {
4198 gl::Program *programObject = context->getProgram(program);
4199
4200 if (programObject)
4201 {
4202 return GL_TRUE;
4203 }
4204 }
4205 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004206 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004208 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209 }
4210
4211 return GL_FALSE;
4212}
4213
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004214GLboolean __stdcall glIsQueryEXT(GLuint id)
4215{
4216 EVENT("(GLuint id = %d)", id);
4217
4218 try
4219 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004220 gl::Context *context = gl::getNonLostContext();
4221
4222 if (context)
4223 {
Geoff Lang37dde692014-01-31 16:34:54 -05004224 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004225 }
4226 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004227 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004229 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004230 }
4231
4232 return GL_FALSE;
4233}
4234
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004235GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004237 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238
4239 try
4240 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004242
4243 if (context && renderbuffer)
4244 {
4245 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4246
4247 if (renderbufferObject)
4248 {
4249 return GL_TRUE;
4250 }
4251 }
4252 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004253 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004255 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004256 }
4257
4258 return GL_FALSE;
4259}
4260
4261GLboolean __stdcall glIsShader(GLuint shader)
4262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004263 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264
4265 try
4266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268
4269 if (context && shader)
4270 {
4271 gl::Shader *shaderObject = context->getShader(shader);
4272
4273 if (shaderObject)
4274 {
4275 return GL_TRUE;
4276 }
4277 }
4278 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004279 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004281 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 }
4283
4284 return GL_FALSE;
4285}
4286
4287GLboolean __stdcall glIsTexture(GLuint texture)
4288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004289 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290
4291 try
4292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294
4295 if (context && texture)
4296 {
4297 gl::Texture *textureObject = context->getTexture(texture);
4298
4299 if (textureObject)
4300 {
4301 return GL_TRUE;
4302 }
4303 }
4304 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004305 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004307 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308 }
4309
4310 return GL_FALSE;
4311}
4312
4313void __stdcall glLineWidth(GLfloat width)
4314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004315 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004316
4317 try
4318 {
4319 if (width <= 0.0f)
4320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004322 }
4323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004325
4326 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004328 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004329 }
4330 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004331 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 }
4335}
4336
4337void __stdcall glLinkProgram(GLuint program)
4338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004339 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340
4341 try
4342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344
4345 if (context)
4346 {
4347 gl::Program *programObject = context->getProgram(program);
4348
4349 if (!programObject)
4350 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004351 if (context->getShader(program))
4352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004354 }
4355 else
4356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004361 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362 }
4363 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004364 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004367 }
4368}
4369
4370void __stdcall glPixelStorei(GLenum pname, GLint param)
4371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004372 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004373
4374 try
4375 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004376 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004377
4378 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004379 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004380 switch (pname)
4381 {
4382 case GL_UNPACK_ALIGNMENT:
4383 if (param != 1 && param != 2 && param != 4 && param != 8)
4384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004386 }
4387
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004388 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004389 break;
4390
4391 case GL_PACK_ALIGNMENT:
4392 if (param != 1 && param != 2 && param != 4 && param != 8)
4393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004394 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004395 }
4396
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004397 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004398 break;
4399
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004400 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4401 context->setPackReverseRowOrder(param != 0);
4402 break;
4403
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004404 case GL_UNPACK_IMAGE_HEIGHT:
4405 case GL_UNPACK_SKIP_IMAGES:
4406 case GL_UNPACK_ROW_LENGTH:
4407 case GL_UNPACK_SKIP_ROWS:
4408 case GL_UNPACK_SKIP_PIXELS:
4409 case GL_PACK_ROW_LENGTH:
4410 case GL_PACK_SKIP_ROWS:
4411 case GL_PACK_SKIP_PIXELS:
4412 if (context->getClientVersion() < 3)
4413 {
4414 return gl::error(GL_INVALID_ENUM);
4415 }
4416 UNIMPLEMENTED();
4417 break;
4418
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004419 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004421 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
4423 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004424 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004426 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 }
4428}
4429
4430void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004432 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 try
4435 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004436 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004437
4438 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004440 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441 }
4442 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004443 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004445 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446 }
4447}
4448
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004449void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4450 GLenum format, GLenum type, GLsizei bufSize,
4451 GLvoid *data)
4452{
4453 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4454 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4455 x, y, width, height, format, type, bufSize, data);
4456
4457 try
4458 {
4459 if (width < 0 || height < 0 || bufSize < 0)
4460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004461 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004462 }
4463
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004464 gl::Context *context = gl::getNonLostContext();
4465
4466 if (context)
4467 {
Jamie Madill26e91952014-03-05 15:01:27 -05004468 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4469 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004470 {
Jamie Madill26e91952014-03-05 15:01:27 -05004471 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004472 }
4473
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004474 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4475 }
4476 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004477 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004479 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004480 }
4481}
4482
4483void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4484 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004485{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004486 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004487 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004488 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489
4490 try
4491 {
4492 if (width < 0 || height < 0)
4493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004494 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495 }
4496
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004497 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498
4499 if (context)
4500 {
Jamie Madill26e91952014-03-05 15:01:27 -05004501 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4502 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004503 {
Jamie Madill26e91952014-03-05 15:01:27 -05004504 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004505 }
4506
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004507 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508 }
4509 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004510 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004512 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513 }
4514}
4515
4516void __stdcall glReleaseShaderCompiler(void)
4517{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004518 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519
4520 try
4521 {
4522 gl::Shader::releaseCompiler();
4523 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004524 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004526 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527 }
4528}
4529
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004530void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004532 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 +00004533 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534
4535 try
4536 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538
4539 if (context)
4540 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004541 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004542 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004543 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004544 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004546
4547 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004548 }
4549 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004550 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004552 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 }
4554}
4555
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004556void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4557{
4558 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4559}
4560
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4562{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004563 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564
4565 try
4566 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004567 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004568
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569 if (context)
4570 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004571 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004572 }
4573 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004574 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004577 }
4578}
4579
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004580void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4581{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004582 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004583
4584 try
4585 {
4586 if (condition != GL_ALL_COMPLETED_NV)
4587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004588 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004589 }
4590
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004591 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004592
4593 if (context)
4594 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004595 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004596
4597 if (fenceObject == NULL)
4598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004599 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004600 }
4601
4602 fenceObject->setFence(condition);
4603 }
4604 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004605 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004607 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004608 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004609}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004610
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004613 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 +00004614
4615 try
4616 {
4617 if (width < 0 || height < 0)
4618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004620 }
4621
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004622 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004623
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 if (context)
4625 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004626 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
4628 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004629 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004631 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633}
4634
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004635void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004637 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004638 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004639 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004640
4641 try
4642 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004643 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004646 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649 }
4650}
4651
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004652void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004654 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 +00004655 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004656
4657 try
4658 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004659 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 }
4663
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004665
4666 if (context)
4667 {
4668 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004669
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670 if (!shaderObject)
4671 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004672 if (context->getProgram(shader))
4673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004674 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004675 }
4676 else
4677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004678 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004679 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680 }
4681
4682 shaderObject->setSource(count, string, length);
4683 }
4684 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004685 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688 }
4689}
4690
4691void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4692{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004693 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004694}
4695
4696void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004698 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 +00004699
4700 try
4701 {
4702 switch (face)
4703 {
4704 case GL_FRONT:
4705 case GL_BACK:
4706 case GL_FRONT_AND_BACK:
4707 break;
4708 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004709 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004710 }
4711
4712 switch (func)
4713 {
4714 case GL_NEVER:
4715 case GL_ALWAYS:
4716 case GL_LESS:
4717 case GL_LEQUAL:
4718 case GL_EQUAL:
4719 case GL_GEQUAL:
4720 case GL_GREATER:
4721 case GL_NOTEQUAL:
4722 break;
4723 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004724 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725 }
4726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728
4729 if (context)
4730 {
4731 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4732 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004733 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734 }
4735
4736 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4737 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004738 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004739 }
4740 }
4741 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004742 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004744 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004745 }
4746}
4747
4748void __stdcall glStencilMask(GLuint mask)
4749{
4750 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4751}
4752
4753void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4754{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004755 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756
4757 try
4758 {
4759 switch (face)
4760 {
4761 case GL_FRONT:
4762 case GL_BACK:
4763 case GL_FRONT_AND_BACK:
4764 break;
4765 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004766 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004767 }
4768
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004769 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770
4771 if (context)
4772 {
4773 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4774 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004775 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777
4778 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4779 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004780 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782 }
4783 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004784 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004786 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787 }
4788}
4789
4790void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4791{
4792 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4793}
4794
4795void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004797 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 +00004798 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799
4800 try
4801 {
4802 switch (face)
4803 {
4804 case GL_FRONT:
4805 case GL_BACK:
4806 case GL_FRONT_AND_BACK:
4807 break;
4808 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810 }
4811
4812 switch (fail)
4813 {
4814 case GL_ZERO:
4815 case GL_KEEP:
4816 case GL_REPLACE:
4817 case GL_INCR:
4818 case GL_DECR:
4819 case GL_INVERT:
4820 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004821 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004822 break;
4823 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004824 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825 }
4826
4827 switch (zfail)
4828 {
4829 case GL_ZERO:
4830 case GL_KEEP:
4831 case GL_REPLACE:
4832 case GL_INCR:
4833 case GL_DECR:
4834 case GL_INVERT:
4835 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004836 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004837 break;
4838 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004840 }
4841
4842 switch (zpass)
4843 {
4844 case GL_ZERO:
4845 case GL_KEEP:
4846 case GL_REPLACE:
4847 case GL_INCR:
4848 case GL_DECR:
4849 case GL_INVERT:
4850 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004851 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852 break;
4853 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004854 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855 }
4856
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004858
4859 if (context)
4860 {
4861 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4862 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004863 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004864 }
4865
4866 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4867 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004868 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870 }
4871 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004872 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004875 }
4876}
4877
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004878GLboolean __stdcall glTestFenceNV(GLuint fence)
4879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004880 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004881
4882 try
4883 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004884 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004885
4886 if (context)
4887 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004888 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004889
4890 if (fenceObject == NULL)
4891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004892 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004893 }
4894
Jamie Madillfb9a7402013-07-26 11:55:01 -04004895 if (fenceObject->isFence() != GL_TRUE)
4896 {
4897 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4898 }
4899
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004900 return fenceObject->testFence();
4901 }
4902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004903 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004906 }
4907
4908 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004909}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004910
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004911void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4912 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004914 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004915 "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 +00004916 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004917
4918 try
4919 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004921
4922 if (context)
4923 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004924 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004925 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004926 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004927 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004928 return;
4929 }
4930
4931 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004932 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004933 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004934 {
4935 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004936 }
4937
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004938 switch (target)
4939 {
4940 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004941 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004942 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004943 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004944 }
4945 break;
4946 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004947 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004948 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004949 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004950 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004951 break;
4952 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4953 {
4954 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004955 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004956 }
4957 break;
4958 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4959 {
4960 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004961 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004962 }
4963 break;
4964 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4965 {
4966 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004967 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004968 }
4969 break;
4970 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4971 {
4972 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004973 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004974 }
4975 break;
4976 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4977 {
4978 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004979 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004980 }
4981 break;
4982 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004983 }
4984 }
4985 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004986 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004988 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989 }
4990}
4991
4992void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4993{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004994 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4995
4996 try
4997 {
4998 gl::Context *context = gl::getNonLostContext();
4999
5000 if (context)
5001 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005002 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04005003 {
5004 return;
5005 }
5006
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005007 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005008
Jamie Madillfb8a8302013-07-03 14:24:12 -04005009 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005011 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005012 }
5013
5014 switch (pname)
5015 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005016 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5017 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5018 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5019 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5020 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5021 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005022 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005023 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5024 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005025 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5026 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5027 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5028 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005029 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
5030 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
5031 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
5032 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005033 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005034 }
5035 }
5036 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005037 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005040 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041}
5042
5043void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5044{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005045 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046}
5047
5048void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5049{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005050 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005051
5052 try
5053 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005054 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055
5056 if (context)
5057 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005058 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005059 {
5060 return;
5061 }
5062
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005063 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064
Jamie Madillfb8a8302013-07-03 14:24:12 -04005065 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068 }
5069
5070 switch (pname)
5071 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005072 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5073 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5074 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5075 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5076 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5077 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5078 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5079 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5080 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005081 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5082 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5083 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5084 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005085 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5086 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5087 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5088 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005089 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005090 }
5091 }
5092 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005093 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005096 }
5097}
5098
5099void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5100{
5101 glTexParameteri(target, pname, *params);
5102}
5103
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005104void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5105{
5106 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5107 target, levels, internalformat, width, height);
5108
5109 try
5110 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005111 gl::Context *context = gl::getNonLostContext();
5112
5113 if (context)
5114 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005115 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005116 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005117 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005118 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005119 }
5120
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005121 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005122 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005123 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005124 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005125 }
5126
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005127 switch (target)
5128 {
5129 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005130 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005131 gl::Texture2D *texture2d = context->getTexture2D();
5132 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005133 }
5134 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005135
Geoff Lang01c21d22013-09-24 11:52:16 -04005136 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005137 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005138 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5139 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005140 }
5141 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005142
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005143 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005144 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005145 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005146 }
5147 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005148 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005150 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005151 }
5152}
5153
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005154void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5155 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005157 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005158 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005159 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160 target, level, xoffset, yoffset, width, height, format, type, pixels);
5161
5162 try
5163 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005165
5166 if (context)
5167 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005168 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005169 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005170 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005171 {
5172 return;
5173 }
5174
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005175 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005176 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005177 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005178 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005179 return;
5180 }
5181
Geoff Langc41e42d2014-04-28 10:58:16 -04005182 // Zero sized uploads are valid but no-ops
5183 if (width == 0 || height == 0)
5184 {
5185 return;
5186 }
5187
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005188 switch (target)
5189 {
5190 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005191 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005192 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005193 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005194 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005195 break;
5196
5197 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5198 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5199 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5200 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5201 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5202 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005203 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005204 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005205 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005206 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005207 break;
5208
5209 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005210 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005211 }
5212 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005213 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005214 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005216 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217 }
5218}
5219
5220void __stdcall glUniform1f(GLint location, GLfloat x)
5221{
5222 glUniform1fv(location, 1, &x);
5223}
5224
5225void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5226{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005227 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005228
5229 try
5230 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231 if (count < 0)
5232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005233 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005234 }
5235
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005236 if (location == -1)
5237 {
5238 return;
5239 }
5240
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242
5243 if (context)
5244 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005245 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005246 if (!programBinary)
5247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005248 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005249 }
5250
5251 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005253 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005254 }
5255 }
5256 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005257 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260 }
5261}
5262
5263void __stdcall glUniform1i(GLint location, GLint x)
5264{
5265 glUniform1iv(location, 1, &x);
5266}
5267
5268void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005270 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271
5272 try
5273 {
5274 if (count < 0)
5275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005276 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277 }
5278
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005279 if (location == -1)
5280 {
5281 return;
5282 }
5283
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005284 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005285
5286 if (context)
5287 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005288 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005289 if (!programBinary)
5290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005291 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005292 }
5293
5294 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005296 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005297 }
5298 }
5299 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005300 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303 }
5304}
5305
5306void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5307{
5308 GLfloat xy[2] = {x, y};
5309
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005310 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005311}
5312
5313void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005315 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316
5317 try
5318 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319 if (count < 0)
5320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005323
5324 if (location == -1)
5325 {
5326 return;
5327 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330
5331 if (context)
5332 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005333 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005334 if (!programBinary)
5335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005336 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005337 }
5338
5339 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005341 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342 }
5343 }
5344 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005345 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005347 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005348 }
5349}
5350
5351void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5352{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005353 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005355 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005356}
5357
5358void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5359{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005360 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005361
5362 try
5363 {
5364 if (count < 0)
5365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005367 }
5368
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005369 if (location == -1)
5370 {
5371 return;
5372 }
5373
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005374 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005375
5376 if (context)
5377 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005378 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005379 if (!programBinary)
5380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005381 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005382 }
5383
5384 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005386 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005387 }
5388 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005389 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005390 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005392 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005393 }
5394}
5395
5396void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5397{
5398 GLfloat xyz[3] = {x, y, z};
5399
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005400 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005401}
5402
5403void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5404{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005405 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406
5407 try
5408 {
5409 if (count < 0)
5410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005412 }
5413
5414 if (location == -1)
5415 {
5416 return;
5417 }
5418
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005419 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420
5421 if (context)
5422 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005423 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005424 if (!programBinary)
5425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005426 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005427 }
5428
5429 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 }
5433 }
5434 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005435 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005437 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005438 }
5439}
5440
5441void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5442{
5443 GLint xyz[3] = {x, y, z};
5444
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005445 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446}
5447
5448void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005450 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451
5452 try
5453 {
5454 if (count < 0)
5455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005456 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005457 }
5458
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005459 if (location == -1)
5460 {
5461 return;
5462 }
5463
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005464 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005465
5466 if (context)
5467 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005468 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005469 if (!programBinary)
5470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005471 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005472 }
5473
5474 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005477 }
5478 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005480 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005482 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005483 }
5484}
5485
5486void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5487{
5488 GLfloat xyzw[4] = {x, y, z, w};
5489
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005490 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005491}
5492
5493void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5494{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005495 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496
5497 try
5498 {
5499 if (count < 0)
5500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005502 }
5503
5504 if (location == -1)
5505 {
5506 return;
5507 }
5508
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005509 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005510
5511 if (context)
5512 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005513 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005514 if (!programBinary)
5515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005516 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005517 }
5518
5519 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522 }
5523 }
5524 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005525 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005528 }
5529}
5530
5531void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5532{
5533 GLint xyzw[4] = {x, y, z, w};
5534
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005535 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536}
5537
5538void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005540 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541
5542 try
5543 {
5544 if (count < 0)
5545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547 }
5548
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005549 if (location == -1)
5550 {
5551 return;
5552 }
5553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005555
5556 if (context)
5557 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005558 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005559 if (!programBinary)
5560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005561 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005562 }
5563
5564 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005567 }
5568 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005570 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005572 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573 }
5574}
5575
5576void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5577{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005578 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005579 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005580
5581 try
5582 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005583 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005585 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586 }
5587
5588 if (location == -1)
5589 {
5590 return;
5591 }
5592
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005593 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594
5595 if (context)
5596 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005597 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5598 {
5599 return gl::error(GL_INVALID_VALUE);
5600 }
5601
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005602 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005603 if (!programBinary)
5604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005606 }
5607
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005608 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
5612 }
5613 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005614 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005616 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617 }
5618}
5619
5620void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5621{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005622 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005623 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005624
5625 try
5626 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005627 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005629 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005630 }
5631
5632 if (location == -1)
5633 {
5634 return;
5635 }
5636
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005637 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005638
5639 if (context)
5640 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005641 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5642 {
5643 return gl::error(GL_INVALID_VALUE);
5644 }
5645
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005646 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005647 if (!programBinary)
5648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005649 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005650 }
5651
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005652 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655 }
5656 }
5657 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005658 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661 }
5662}
5663
5664void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5665{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005666 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005667 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668
5669 try
5670 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005671 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005673 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
5675
5676 if (location == -1)
5677 {
5678 return;
5679 }
5680
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005681 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005682
5683 if (context)
5684 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005685 if (transpose != GL_FALSE && context->getClientVersion() < 3)
5686 {
5687 return gl::error(GL_INVALID_VALUE);
5688 }
5689
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005690 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005691 if (!programBinary)
5692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005694 }
5695
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005696 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005699 }
5700 }
5701 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005702 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005704 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005705 }
5706}
5707
5708void __stdcall glUseProgram(GLuint program)
5709{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005710 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711
5712 try
5713 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005714 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005715
5716 if (context)
5717 {
5718 gl::Program *programObject = context->getProgram(program);
5719
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005720 if (!programObject && program != 0)
5721 {
5722 if (context->getShader(program))
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005725 }
5726 else
5727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005728 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005729 }
5730 }
5731
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005732 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005734 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005735 }
5736
5737 context->useProgram(program);
5738 }
5739 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005740 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 }
5744}
5745
5746void __stdcall glValidateProgram(GLuint program)
5747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005748 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005749
5750 try
5751 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005753
5754 if (context)
5755 {
5756 gl::Program *programObject = context->getProgram(program);
5757
5758 if (!programObject)
5759 {
5760 if (context->getShader(program))
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005763 }
5764 else
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005767 }
5768 }
5769
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005770 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005771 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005773 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005776 }
5777}
5778
5779void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005781 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005782
5783 try
5784 {
5785 if (index >= gl::MAX_VERTEX_ATTRIBS)
5786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005788 }
5789
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005791
5792 if (context)
5793 {
5794 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005795 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005796 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005798 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802}
5803
5804void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005806 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005807
5808 try
5809 {
5810 if (index >= gl::MAX_VERTEX_ATTRIBS)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 }
5814
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005815 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005816
5817 if (context)
5818 {
5819 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005820 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005821 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005823 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005825 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005826 }
5827}
5828
5829void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005831 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005832
5833 try
5834 {
5835 if (index >= gl::MAX_VERTEX_ATTRIBS)
5836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838 }
5839
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005841
5842 if (context)
5843 {
5844 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005845 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005846 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005848 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005850 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 }
5852}
5853
5854void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5855{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005856 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005857
5858 try
5859 {
5860 if (index >= gl::MAX_VERTEX_ATTRIBS)
5861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005862 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005863 }
5864
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005866
5867 if (context)
5868 {
5869 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005870 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005871 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005873 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005875 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005876 }
5877}
5878
5879void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005881 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 +00005882
5883 try
5884 {
5885 if (index >= gl::MAX_VERTEX_ATTRIBS)
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005888 }
5889
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005891
5892 if (context)
5893 {
5894 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005895 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005896 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005897 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005898 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005901 }
5902}
5903
5904void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005906 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907
5908 try
5909 {
5910 if (index >= gl::MAX_VERTEX_ATTRIBS)
5911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005912 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005913 }
5914
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005915 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005916
5917 if (context)
5918 {
5919 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005920 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005921 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005922 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005923 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005925 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005926 }
5927}
5928
5929void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5930{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005931 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 +00005932
5933 try
5934 {
5935 if (index >= gl::MAX_VERTEX_ATTRIBS)
5936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005937 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938 }
5939
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005940 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005941
5942 if (context)
5943 {
5944 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005945 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005946 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005948 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005950 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005951 }
5952}
5953
5954void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005956 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005957
5958 try
5959 {
5960 if (index >= gl::MAX_VERTEX_ATTRIBS)
5961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005962 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005963 }
5964
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005965 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005966
5967 if (context)
5968 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005969 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005970 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005972 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005974 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005975 }
5976}
5977
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005978void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5979{
5980 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5981
5982 try
5983 {
5984 if (index >= gl::MAX_VERTEX_ATTRIBS)
5985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005986 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005987 }
5988
5989 gl::Context *context = gl::getNonLostContext();
5990
5991 if (context)
5992 {
5993 context->setVertexAttribDivisor(index, divisor);
5994 }
5995 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005996 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005999 }
6000}
6001
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006002void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006003{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006004 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006005 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006006 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006007
6008 try
6009 {
6010 if (index >= gl::MAX_VERTEX_ATTRIBS)
6011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006012 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006013 }
6014
6015 if (size < 1 || size > 4)
6016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006020 gl::Context *context = gl::getNonLostContext();
6021
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 switch (type)
6023 {
6024 case GL_BYTE:
6025 case GL_UNSIGNED_BYTE:
6026 case GL_SHORT:
6027 case GL_UNSIGNED_SHORT:
6028 case GL_FIXED:
6029 case GL_FLOAT:
6030 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006031 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00006032 case GL_INT:
6033 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006034 case GL_INT_2_10_10_10_REV:
6035 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00006036 if (context && context->getClientVersion() < 3)
6037 {
6038 return gl::error(GL_INVALID_ENUM);
6039 }
6040 else
6041 {
6042 break;
6043 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006045 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046 }
6047
6048 if (stride < 0)
6049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 }
6052
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00006053 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
6054 {
6055 return gl::error(GL_INVALID_OPERATION);
6056 }
6057
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 if (context)
6059 {
Jamie Madilld8db8662013-07-02 11:57:04 -04006060 // [OpenGL ES 3.0.2] Section 2.8 page 24:
6061 // An INVALID_OPERATION error is generated when a non-zero vertex array object
6062 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
6063 // and the pointer argument is not NULL.
6064 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
6065 {
6066 return gl::error(GL_INVALID_OPERATION);
6067 }
6068
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00006069 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
6070 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006071 }
6072 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006073 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006076 }
6077}
6078
6079void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006081 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 +00006082
6083 try
6084 {
6085 if (width < 0 || height < 0)
6086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006087 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006088 }
6089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006091
6092 if (context)
6093 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006094 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095 }
6096 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006097 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006099 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100 }
6101}
6102
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006103// OpenGL ES 3.0 functions
6104
6105void __stdcall glReadBuffer(GLenum mode)
6106{
6107 EVENT("(GLenum mode = 0x%X)", mode);
6108
6109 try
6110 {
6111 gl::Context *context = gl::getNonLostContext();
6112
6113 if (context)
6114 {
6115 if (context->getClientVersion() < 3)
6116 {
6117 return gl::error(GL_INVALID_OPERATION);
6118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006119
Jamie Madill54133512013-06-21 09:33:07 -04006120 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006121 UNIMPLEMENTED();
6122 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006123 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006124 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006125 {
6126 return gl::error(GL_OUT_OF_MEMORY);
6127 }
6128}
6129
6130void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
6131{
6132 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
6133 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
6134
6135 try
6136 {
6137 gl::Context *context = gl::getNonLostContext();
6138
6139 if (context)
6140 {
6141 if (context->getClientVersion() < 3)
6142 {
6143 return gl::error(GL_INVALID_OPERATION);
6144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006145
Jamie Madill54133512013-06-21 09:33:07 -04006146 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006147 UNIMPLEMENTED();
6148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006149 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006150 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006151 {
6152 return gl::error(GL_OUT_OF_MEMORY);
6153 }
6154}
6155
6156void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
6157{
6158 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
6159 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
6160 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6161 target, level, internalformat, width, height, depth, border, format, type, pixels);
6162
6163 try
6164 {
6165 gl::Context *context = gl::getNonLostContext();
6166
6167 if (context)
6168 {
6169 if (context->getClientVersion() < 3)
6170 {
6171 return gl::error(GL_INVALID_OPERATION);
6172 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006173
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006174 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006175 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006176 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006177 {
6178 return;
6179 }
6180
6181 switch(target)
6182 {
6183 case GL_TEXTURE_3D:
6184 {
6185 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006186 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006187 }
6188 break;
6189
6190 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006191 {
6192 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006193 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006194 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006195 break;
6196
6197 default:
6198 return gl::error(GL_INVALID_ENUM);
6199 }
6200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006201 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006202 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006203 {
6204 return gl::error(GL_OUT_OF_MEMORY);
6205 }
6206}
6207
6208void __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)
6209{
6210 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6211 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6212 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6213 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6214
6215 try
6216 {
6217 gl::Context *context = gl::getNonLostContext();
6218
6219 if (context)
6220 {
6221 if (context->getClientVersion() < 3)
6222 {
6223 return gl::error(GL_INVALID_OPERATION);
6224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006225
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006226 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006227 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006228 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006229 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006230 {
6231 return;
6232 }
6233
Geoff Langc41e42d2014-04-28 10:58:16 -04006234 // Zero sized uploads are valid but no-ops
6235 if (width == 0 || height == 0 || depth == 0)
6236 {
6237 return;
6238 }
6239
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006240 switch(target)
6241 {
6242 case GL_TEXTURE_3D:
6243 {
6244 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006245 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 +00006246 }
6247 break;
6248
6249 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006250 {
6251 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006252 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 +00006253 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006254 break;
6255
6256 default:
6257 return gl::error(GL_INVALID_ENUM);
6258 }
6259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006260 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006261 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006262 {
6263 return gl::error(GL_OUT_OF_MEMORY);
6264 }
6265}
6266
6267void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6268{
6269 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6270 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6271 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6272
6273 try
6274 {
6275 gl::Context *context = gl::getNonLostContext();
6276
6277 if (context)
6278 {
6279 if (context->getClientVersion() < 3)
6280 {
6281 return gl::error(GL_INVALID_OPERATION);
6282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006283
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006284 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006285 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006286 {
6287 return;
6288 }
6289
Geoff Langc41e42d2014-04-28 10:58:16 -04006290 // Zero sized copies are valid but no-ops
6291 if (width == 0 || height == 0)
6292 {
6293 return;
6294 }
6295
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006296 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6297 gl::Texture *texture = NULL;
6298 switch (target)
6299 {
6300 case GL_TEXTURE_3D:
6301 texture = context->getTexture3D();
6302 break;
6303
6304 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006305 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006306 break;
6307
6308 default:
6309 return gl::error(GL_INVALID_ENUM);
6310 }
6311
6312 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6313 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006314 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006315 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006316 {
6317 return gl::error(GL_OUT_OF_MEMORY);
6318 }
6319}
6320
6321void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6322{
Geoff Langeef52cc2013-10-16 15:07:39 -04006323 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 +00006324 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6325 "const GLvoid* data = 0x%0.8p)",
6326 target, level, internalformat, width, height, depth, border, imageSize, data);
6327
6328 try
6329 {
6330 gl::Context *context = gl::getNonLostContext();
6331
6332 if (context)
6333 {
6334 if (context->getClientVersion() < 3)
6335 {
6336 return gl::error(GL_INVALID_OPERATION);
6337 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006338
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006339 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 +00006340 {
6341 return gl::error(GL_INVALID_VALUE);
6342 }
6343
6344 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006345 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006346 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006347 {
6348 return;
6349 }
6350
6351 switch(target)
6352 {
6353 case GL_TEXTURE_3D:
6354 {
6355 gl::Texture3D *texture = context->getTexture3D();
6356 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6357 }
6358 break;
6359
6360 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006361 {
6362 gl::Texture2DArray *texture = context->getTexture2DArray();
6363 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6364 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006365 break;
6366
6367 default:
6368 return gl::error(GL_INVALID_ENUM);
6369 }
6370 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006371 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006372 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006373 {
6374 return gl::error(GL_OUT_OF_MEMORY);
6375 }
6376}
6377
6378void __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)
6379{
6380 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6381 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6382 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6383 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6384
6385 try
6386 {
6387 gl::Context *context = gl::getNonLostContext();
6388
6389 if (context)
6390 {
6391 if (context->getClientVersion() < 3)
6392 {
6393 return gl::error(GL_INVALID_OPERATION);
6394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006395
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006396 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 +00006397 {
6398 return gl::error(GL_INVALID_VALUE);
6399 }
6400
6401 if (!data)
6402 {
6403 return gl::error(GL_INVALID_VALUE);
6404 }
6405
6406 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006407 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006408 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006409 {
6410 return;
6411 }
6412
Geoff Langc41e42d2014-04-28 10:58:16 -04006413 // Zero sized uploads are valid but no-ops
6414 if (width == 0 || height == 0)
6415 {
6416 return;
6417 }
6418
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006419 switch(target)
6420 {
6421 case GL_TEXTURE_3D:
6422 {
6423 gl::Texture3D *texture = context->getTexture3D();
6424 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6425 format, imageSize, data);
6426 }
6427 break;
6428
6429 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006430 {
6431 gl::Texture2DArray *texture = context->getTexture2DArray();
6432 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6433 format, imageSize, data);
6434 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006435 break;
6436
6437 default:
6438 return gl::error(GL_INVALID_ENUM);
6439 }
6440 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006441 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006442 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006443 {
6444 return gl::error(GL_OUT_OF_MEMORY);
6445 }
6446}
6447
6448void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6449{
6450 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6451
6452 try
6453 {
6454 gl::Context *context = gl::getNonLostContext();
6455
6456 if (context)
6457 {
6458 if (context->getClientVersion() < 3)
6459 {
6460 return gl::error(GL_INVALID_OPERATION);
6461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006462
Geoff Lang37dde692014-01-31 16:34:54 -05006463 if (n < 0)
6464 {
6465 return gl::error(GL_INVALID_VALUE);
6466 }
6467
6468 for (GLsizei i = 0; i < n; i++)
6469 {
6470 ids[i] = context->createQuery();
6471 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006472 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006473 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006474 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006475 {
6476 return gl::error(GL_OUT_OF_MEMORY);
6477 }
6478}
6479
6480void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6481{
6482 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6483
6484 try
6485 {
6486 gl::Context *context = gl::getNonLostContext();
6487
6488 if (context)
6489 {
6490 if (context->getClientVersion() < 3)
6491 {
6492 return gl::error(GL_INVALID_OPERATION);
6493 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006494
Geoff Lang37dde692014-01-31 16:34:54 -05006495 if (n < 0)
6496 {
6497 return gl::error(GL_INVALID_VALUE);
6498 }
6499
6500 for (GLsizei i = 0; i < n; i++)
6501 {
6502 context->deleteQuery(ids[i]);
6503 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006505 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006506 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006507 {
6508 return gl::error(GL_OUT_OF_MEMORY);
6509 }
6510}
6511
6512GLboolean __stdcall glIsQuery(GLuint id)
6513{
6514 EVENT("(GLuint id = %u)", id);
6515
6516 try
6517 {
6518 gl::Context *context = gl::getNonLostContext();
6519
6520 if (context)
6521 {
6522 if (context->getClientVersion() < 3)
6523 {
6524 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6525 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006526
Geoff Lang37dde692014-01-31 16:34:54 -05006527 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006528 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006529 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006530 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006531 {
6532 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6533 }
6534
6535 return GL_FALSE;
6536}
6537
6538void __stdcall glBeginQuery(GLenum target, GLuint id)
6539{
6540 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6541
6542 try
6543 {
6544 gl::Context *context = gl::getNonLostContext();
6545
6546 if (context)
6547 {
6548 if (context->getClientVersion() < 3)
6549 {
6550 return gl::error(GL_INVALID_OPERATION);
6551 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006552
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006553 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006554 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006555 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006556 }
Geoff Lang37dde692014-01-31 16:34:54 -05006557 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006558 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006559 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006560 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006561 {
6562 return gl::error(GL_OUT_OF_MEMORY);
6563 }
6564}
6565
6566void __stdcall glEndQuery(GLenum target)
6567{
6568 EVENT("(GLenum target = 0x%X)", target);
6569
6570 try
6571 {
6572 gl::Context *context = gl::getNonLostContext();
6573
6574 if (context)
6575 {
6576 if (context->getClientVersion() < 3)
6577 {
6578 return gl::error(GL_INVALID_OPERATION);
6579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580
Jamie Madill45c785d2014-05-13 14:09:34 -04006581 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006582 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006583 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006584 }
Geoff Lang37dde692014-01-31 16:34:54 -05006585
6586 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006588 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006589 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006590 {
6591 return gl::error(GL_OUT_OF_MEMORY);
6592 }
6593}
6594
6595void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6596{
6597 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6598
6599 try
6600 {
6601 gl::Context *context = gl::getNonLostContext();
6602
6603 if (context)
6604 {
6605 if (context->getClientVersion() < 3)
6606 {
6607 return gl::error(GL_INVALID_OPERATION);
6608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006609
Geoff Lang37dde692014-01-31 16:34:54 -05006610 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006611 {
Geoff Lang37dde692014-01-31 16:34:54 -05006612 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006613 }
Geoff Lang37dde692014-01-31 16:34:54 -05006614
6615 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006616 {
Geoff Lang37dde692014-01-31 16:34:54 -05006617 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006618 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006619 break;
6620
6621 default:
6622 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006623 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006624 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006625 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006626 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627 {
6628 return gl::error(GL_OUT_OF_MEMORY);
6629 }
6630}
6631
6632void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6633{
6634 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6635
6636 try
6637 {
6638 gl::Context *context = gl::getNonLostContext();
6639
6640 if (context)
6641 {
6642 if (context->getClientVersion() < 3)
6643 {
6644 return gl::error(GL_INVALID_OPERATION);
6645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006646
Geoff Lang37dde692014-01-31 16:34:54 -05006647 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6648
6649 if (!queryObject)
6650 {
6651 return gl::error(GL_INVALID_OPERATION);
6652 }
6653
Jamie Madill45c785d2014-05-13 14:09:34 -04006654 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006655 {
6656 return gl::error(GL_INVALID_OPERATION);
6657 }
6658
6659 switch(pname)
6660 {
6661 case GL_QUERY_RESULT:
6662 params[0] = queryObject->getResult();
6663 break;
6664 case GL_QUERY_RESULT_AVAILABLE:
6665 params[0] = queryObject->isResultAvailable();
6666 break;
6667 default:
6668 return gl::error(GL_INVALID_ENUM);
6669 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006671 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006672 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006673 {
6674 return gl::error(GL_OUT_OF_MEMORY);
6675 }
6676}
6677
6678GLboolean __stdcall glUnmapBuffer(GLenum target)
6679{
6680 EVENT("(GLenum target = 0x%X)", target);
6681
6682 try
6683 {
6684 gl::Context *context = gl::getNonLostContext();
6685
6686 if (context)
6687 {
6688 if (context->getClientVersion() < 3)
6689 {
6690 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6691 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006692
Shannon Woodsb3801742014-03-27 14:59:19 -04006693 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006694 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006695 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006696 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006697 {
6698 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6699 }
6700
6701 return GL_FALSE;
6702}
6703
6704void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6705{
6706 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6707
6708 try
6709 {
6710 gl::Context *context = gl::getNonLostContext();
6711
6712 if (context)
6713 {
6714 if (context->getClientVersion() < 3)
6715 {
6716 return gl::error(GL_INVALID_OPERATION);
6717 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006718
Shannon Woodsb3801742014-03-27 14:59:19 -04006719 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006721 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006722 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006723 {
6724 return gl::error(GL_OUT_OF_MEMORY);
6725 }
6726}
6727
6728void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6729{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006730 try
6731 {
6732 gl::Context *context = gl::getNonLostContext();
6733
6734 if (context)
6735 {
6736 if (context->getClientVersion() < 3)
6737 {
6738 return gl::error(GL_INVALID_OPERATION);
6739 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006740
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006741 glDrawBuffersEXT(n, bufs);
6742 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006743 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006744 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006745 {
6746 return gl::error(GL_OUT_OF_MEMORY);
6747 }
6748}
6749
6750void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6751{
6752 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6753 location, count, transpose, value);
6754
6755 try
6756 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006757 if (count < 0)
6758 {
6759 return gl::error(GL_INVALID_VALUE);
6760 }
6761
6762 if (location == -1)
6763 {
6764 return;
6765 }
6766
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006767 gl::Context *context = gl::getNonLostContext();
6768
6769 if (context)
6770 {
6771 if (context->getClientVersion() < 3)
6772 {
6773 return gl::error(GL_INVALID_OPERATION);
6774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006775
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006776 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6777 if (!programBinary)
6778 {
6779 return gl::error(GL_INVALID_OPERATION);
6780 }
6781
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006782 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006783 {
6784 return gl::error(GL_INVALID_OPERATION);
6785 }
6786 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006787 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006788 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006789 {
6790 return gl::error(GL_OUT_OF_MEMORY);
6791 }
6792}
6793
6794void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6795{
6796 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6797 location, count, transpose, value);
6798
6799 try
6800 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006801 if (count < 0)
6802 {
6803 return gl::error(GL_INVALID_VALUE);
6804 }
6805
6806 if (location == -1)
6807 {
6808 return;
6809 }
6810
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006811 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.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006820 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6821 if (!programBinary)
6822 {
6823 return gl::error(GL_INVALID_OPERATION);
6824 }
6825
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006826 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006827 {
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
6830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006831 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006832 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006833 {
6834 return gl::error(GL_OUT_OF_MEMORY);
6835 }
6836}
6837
6838void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6839{
6840 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6841 location, count, transpose, value);
6842
6843 try
6844 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006845 if (count < 0)
6846 {
6847 return gl::error(GL_INVALID_VALUE);
6848 }
6849
6850 if (location == -1)
6851 {
6852 return;
6853 }
6854
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006855 gl::Context *context = gl::getNonLostContext();
6856
6857 if (context)
6858 {
6859 if (context->getClientVersion() < 3)
6860 {
6861 return gl::error(GL_INVALID_OPERATION);
6862 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006863
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006864 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6865 if (!programBinary)
6866 {
6867 return gl::error(GL_INVALID_OPERATION);
6868 }
6869
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006870 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006871 {
6872 return gl::error(GL_INVALID_OPERATION);
6873 }
6874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006875 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006876 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006877 {
6878 return gl::error(GL_OUT_OF_MEMORY);
6879 }
6880}
6881
6882void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6883{
6884 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6885 location, count, transpose, value);
6886
6887 try
6888 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006889 if (count < 0)
6890 {
6891 return gl::error(GL_INVALID_VALUE);
6892 }
6893
6894 if (location == -1)
6895 {
6896 return;
6897 }
6898
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006899 gl::Context *context = gl::getNonLostContext();
6900
6901 if (context)
6902 {
6903 if (context->getClientVersion() < 3)
6904 {
6905 return gl::error(GL_INVALID_OPERATION);
6906 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006907
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006908 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6909 if (!programBinary)
6910 {
6911 return gl::error(GL_INVALID_OPERATION);
6912 }
6913
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006914 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006915 {
6916 return gl::error(GL_INVALID_OPERATION);
6917 }
6918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006919 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006920 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921 {
6922 return gl::error(GL_OUT_OF_MEMORY);
6923 }
6924}
6925
6926void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6927{
6928 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6929 location, count, transpose, value);
6930
6931 try
6932 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006933 if (count < 0)
6934 {
6935 return gl::error(GL_INVALID_VALUE);
6936 }
6937
6938 if (location == -1)
6939 {
6940 return;
6941 }
6942
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006943 gl::Context *context = gl::getNonLostContext();
6944
6945 if (context)
6946 {
6947 if (context->getClientVersion() < 3)
6948 {
6949 return gl::error(GL_INVALID_OPERATION);
6950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006951
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006952 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6953 if (!programBinary)
6954 {
6955 return gl::error(GL_INVALID_OPERATION);
6956 }
6957
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006958 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006959 {
6960 return gl::error(GL_INVALID_OPERATION);
6961 }
6962 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006963 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006964 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006965 {
6966 return gl::error(GL_OUT_OF_MEMORY);
6967 }
6968}
6969
6970void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6971{
6972 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6973 location, count, transpose, value);
6974
6975 try
6976 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006977 if (count < 0)
6978 {
6979 return gl::error(GL_INVALID_VALUE);
6980 }
6981
6982 if (location == -1)
6983 {
6984 return;
6985 }
6986
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006987 gl::Context *context = gl::getNonLostContext();
6988
6989 if (context)
6990 {
6991 if (context->getClientVersion() < 3)
6992 {
6993 return gl::error(GL_INVALID_OPERATION);
6994 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006995
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006996 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6997 if (!programBinary)
6998 {
6999 return gl::error(GL_INVALID_OPERATION);
7000 }
7001
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007002 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007003 {
7004 return gl::error(GL_INVALID_OPERATION);
7005 }
7006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007007 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007008 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007009 {
7010 return gl::error(GL_OUT_OF_MEMORY);
7011 }
7012}
7013
7014void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
7015{
7016 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
7017 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
7018 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
7019
7020 try
7021 {
7022 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007023 if (context)
7024 {
7025 if (context->getClientVersion() < 3)
7026 {
7027 return gl::error(GL_INVALID_OPERATION);
7028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007029
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007030 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04007031 dstX0, dstY0, dstX1, dstY1, mask, filter,
7032 false))
7033 {
7034 return;
7035 }
7036
7037 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
7038 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007040 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007041 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007042 {
7043 return gl::error(GL_OUT_OF_MEMORY);
7044 }
7045}
7046
7047void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
7048{
7049 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
7050 target, samples, internalformat, width, height);
7051
7052 try
7053 {
7054 gl::Context *context = gl::getNonLostContext();
7055
7056 if (context)
7057 {
7058 if (context->getClientVersion() < 3)
7059 {
7060 return gl::error(GL_INVALID_OPERATION);
7061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007062
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007063 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04007064 width, height, false))
7065 {
7066 return;
7067 }
7068
7069 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007070 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007071 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007072 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007073 {
7074 return gl::error(GL_OUT_OF_MEMORY);
7075 }
7076}
7077
7078void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
7079{
7080 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
7081 target, attachment, texture, level, layer);
7082
7083 try
7084 {
7085 gl::Context *context = gl::getNonLostContext();
7086
7087 if (context)
7088 {
7089 if (context->getClientVersion() < 3)
7090 {
7091 return gl::error(GL_INVALID_OPERATION);
7092 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007093
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007094 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04007095 {
7096 return;
7097 }
7098
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05007099 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
7100 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04007101
7102 gl::Texture *textureObject = context->getTexture(texture);
7103 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
7104
7105 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
7106 {
7107 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
7108 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
7109 }
7110 else
7111 {
7112 switch (attachment)
7113 {
7114 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
7115 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
7116 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
7117 }
7118 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007120 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007121 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007122 {
7123 return gl::error(GL_OUT_OF_MEMORY);
7124 }
7125}
7126
7127GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
7128{
7129 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
7130 target, offset, length, access);
7131
7132 try
7133 {
7134 gl::Context *context = gl::getNonLostContext();
7135
7136 if (context)
7137 {
7138 if (context->getClientVersion() < 3)
7139 {
7140 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
7141 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007142
Shannon Woods916e7692014-03-27 16:58:22 -04007143 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007145 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007146 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007147 {
7148 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
7149 }
7150
7151 return NULL;
7152}
7153
7154void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
7155{
7156 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
7157
7158 try
7159 {
7160 gl::Context *context = gl::getNonLostContext();
7161
7162 if (context)
7163 {
7164 if (context->getClientVersion() < 3)
7165 {
7166 return gl::error(GL_INVALID_OPERATION);
7167 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007168
Shannon Woods916e7692014-03-27 16:58:22 -04007169 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007171 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007172 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007173 {
7174 return gl::error(GL_OUT_OF_MEMORY);
7175 }
7176}
7177
7178void __stdcall glBindVertexArray(GLuint array)
7179{
7180 EVENT("(GLuint array = %u)", array);
7181
7182 try
7183 {
7184 gl::Context *context = gl::getNonLostContext();
7185
7186 if (context)
7187 {
7188 if (context->getClientVersion() < 3)
7189 {
7190 return gl::error(GL_INVALID_OPERATION);
7191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007192
Jamie Madilld1028542013-07-02 11:57:04 -04007193 gl::VertexArray *vao = context->getVertexArray(array);
7194
7195 if (!vao)
7196 {
7197 // The default VAO should always exist
7198 ASSERT(array != 0);
7199 return gl::error(GL_INVALID_OPERATION);
7200 }
7201
7202 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007204 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007205 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007206 {
7207 return gl::error(GL_OUT_OF_MEMORY);
7208 }
7209}
7210
7211void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
7212{
7213 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
7214
7215 try
7216 {
7217 gl::Context *context = gl::getNonLostContext();
7218
7219 if (context)
7220 {
7221 if (context->getClientVersion() < 3)
7222 {
7223 return gl::error(GL_INVALID_OPERATION);
7224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007225
Jamie Madilld1028542013-07-02 11:57:04 -04007226 if (n < 0)
7227 {
7228 return gl::error(GL_INVALID_VALUE);
7229 }
7230
7231 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7232 {
7233 if (arrays[arrayIndex] != 0)
7234 {
7235 context->deleteVertexArray(arrays[arrayIndex]);
7236 }
7237 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007238 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007239 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007240 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007241 {
7242 return gl::error(GL_OUT_OF_MEMORY);
7243 }
7244}
7245
7246void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
7247{
7248 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
7249
7250 try
7251 {
7252 gl::Context *context = gl::getNonLostContext();
7253
7254 if (context)
7255 {
7256 if (context->getClientVersion() < 3)
7257 {
7258 return gl::error(GL_INVALID_OPERATION);
7259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007260
Jamie Madilld1028542013-07-02 11:57:04 -04007261 if (n < 0)
7262 {
7263 return gl::error(GL_INVALID_VALUE);
7264 }
7265
7266 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
7267 {
7268 arrays[arrayIndex] = context->createVertexArray();
7269 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007270 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007271 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007272 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007273 {
7274 return gl::error(GL_OUT_OF_MEMORY);
7275 }
7276}
7277
7278GLboolean __stdcall glIsVertexArray(GLuint array)
7279{
7280 EVENT("(GLuint array = %u)", array);
7281
7282 try
7283 {
7284 gl::Context *context = gl::getNonLostContext();
7285
7286 if (context)
7287 {
7288 if (context->getClientVersion() < 3)
7289 {
7290 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7291 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007292
Jamie Madilld1028542013-07-02 11:57:04 -04007293 if (array == 0)
7294 {
7295 return GL_FALSE;
7296 }
7297
7298 gl::VertexArray *vao = context->getVertexArray(array);
7299
7300 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007302 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007303 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007304 {
7305 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7306 }
7307
7308 return GL_FALSE;
7309}
7310
7311void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7312{
7313 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7314 target, index, data);
7315
7316 try
7317 {
7318 gl::Context *context = gl::getNonLostContext();
7319
7320 if (context)
7321 {
7322 if (context->getClientVersion() < 3)
7323 {
7324 return gl::error(GL_INVALID_OPERATION);
7325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007326
Shannon Woods15934d52013-08-19 14:28:49 -04007327 switch (target)
7328 {
7329 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7330 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7331 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7332 if (index >= context->getMaxTransformFeedbackBufferBindings())
7333 return gl::error(GL_INVALID_VALUE);
7334 break;
7335 case GL_UNIFORM_BUFFER_START:
7336 case GL_UNIFORM_BUFFER_SIZE:
7337 case GL_UNIFORM_BUFFER_BINDING:
7338 if (index >= context->getMaximumCombinedUniformBufferBindings())
7339 return gl::error(GL_INVALID_VALUE);
7340 break;
7341 default:
7342 return gl::error(GL_INVALID_ENUM);
7343 }
7344
7345 if (!(context->getIndexedIntegerv(target, index, data)))
7346 {
7347 GLenum nativeType;
7348 unsigned int numParams = 0;
7349 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7350 return gl::error(GL_INVALID_ENUM);
7351
7352 if (numParams == 0)
7353 return; // it is known that pname is valid, but there are no parameters to return
7354
7355 if (nativeType == GL_INT_64_ANGLEX)
7356 {
7357 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7358 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7359 GLint64 *int64Params = new GLint64[numParams];
7360
7361 context->getIndexedInteger64v(target, index, int64Params);
7362
7363 for (unsigned int i = 0; i < numParams; ++i)
7364 {
7365 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7366 data[i] = static_cast<GLint>(clampedValue);
7367 }
7368
7369 delete [] int64Params;
7370 }
7371 else
7372 {
7373 UNREACHABLE();
7374 }
7375 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007376 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007377 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007378 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007379 {
7380 return gl::error(GL_OUT_OF_MEMORY);
7381 }
7382}
7383
7384void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7385{
7386 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7387
7388 try
7389 {
7390 gl::Context *context = gl::getNonLostContext();
7391
7392 if (context)
7393 {
7394 if (context->getClientVersion() < 3)
7395 {
7396 return gl::error(GL_INVALID_OPERATION);
7397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007398
Geoff Langc8058452014-02-03 12:04:11 -05007399 switch (primitiveMode)
7400 {
7401 case GL_TRIANGLES:
7402 case GL_LINES:
7403 case GL_POINTS:
7404 break;
7405 default:
7406 return gl::error(GL_INVALID_ENUM);
7407 }
7408
7409 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7410 ASSERT(transformFeedback != NULL);
7411
7412 if (transformFeedback->isStarted())
7413 {
7414 return gl::error(GL_INVALID_OPERATION);
7415 }
7416
7417 if (transformFeedback->isPaused())
7418 {
7419 transformFeedback->resume();
7420 }
7421 else
7422 {
7423 transformFeedback->start(primitiveMode);
7424 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007425 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007426 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007427 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007428 {
7429 return gl::error(GL_OUT_OF_MEMORY);
7430 }
7431}
7432
7433void __stdcall glEndTransformFeedback(void)
7434{
7435 EVENT("(void)");
7436
7437 try
7438 {
7439 gl::Context *context = gl::getNonLostContext();
7440
7441 if (context)
7442 {
7443 if (context->getClientVersion() < 3)
7444 {
7445 return gl::error(GL_INVALID_OPERATION);
7446 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007447
Geoff Langc8058452014-02-03 12:04:11 -05007448 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7449 ASSERT(transformFeedback != NULL);
7450
7451 if (!transformFeedback->isStarted())
7452 {
7453 return gl::error(GL_INVALID_OPERATION);
7454 }
7455
7456 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007458 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007459 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007460 {
7461 return gl::error(GL_OUT_OF_MEMORY);
7462 }
7463}
7464
7465void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7466{
7467 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7468 target, index, buffer, offset, size);
7469
7470 try
7471 {
7472 gl::Context *context = gl::getNonLostContext();
7473
7474 if (context)
7475 {
7476 if (context->getClientVersion() < 3)
7477 {
7478 return gl::error(GL_INVALID_OPERATION);
7479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007480
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007481 switch (target)
7482 {
7483 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007484 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007485 {
7486 return gl::error(GL_INVALID_VALUE);
7487 }
7488 break;
7489
7490 case GL_UNIFORM_BUFFER:
7491 if (index >= context->getMaximumCombinedUniformBufferBindings())
7492 {
7493 return gl::error(GL_INVALID_VALUE);
7494 }
7495 break;
7496
7497 default:
7498 return gl::error(GL_INVALID_ENUM);
7499 }
7500
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007501 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007502 {
7503 return gl::error(GL_INVALID_VALUE);
7504 }
7505
7506 switch (target)
7507 {
7508 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007509
7510 // size and offset must be a multiple of 4
7511 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7512 {
7513 return gl::error(GL_INVALID_VALUE);
7514 }
7515
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007516 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7517 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007518 break;
7519
7520 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007521
7522 // it is an error to bind an offset not a multiple of the alignment
7523 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7524 {
7525 return gl::error(GL_INVALID_VALUE);
7526 }
7527
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007528 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7529 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007530 break;
7531
7532 default:
7533 UNREACHABLE();
7534 }
7535 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007536 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007537 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007538 {
7539 return gl::error(GL_OUT_OF_MEMORY);
7540 }
7541}
7542
7543void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7544{
7545 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7546 target, index, buffer);
7547
7548 try
7549 {
7550 gl::Context *context = gl::getNonLostContext();
7551
7552 if (context)
7553 {
7554 if (context->getClientVersion() < 3)
7555 {
7556 return gl::error(GL_INVALID_OPERATION);
7557 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007558
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007559 switch (target)
7560 {
7561 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007562 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007563 {
7564 return gl::error(GL_INVALID_VALUE);
7565 }
7566 break;
7567
7568 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007569 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007570 {
7571 return gl::error(GL_INVALID_VALUE);
7572 }
7573 break;
7574
7575 default:
7576 return gl::error(GL_INVALID_ENUM);
7577 }
7578
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007579 switch (target)
7580 {
7581 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007582 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007583 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007584 break;
7585
7586 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007587 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007588 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007589 break;
7590
7591 default:
7592 UNREACHABLE();
7593 }
7594 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007595 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007596 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007597 {
7598 return gl::error(GL_OUT_OF_MEMORY);
7599 }
7600}
7601
7602void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7603{
7604 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7605 program, count, varyings, bufferMode);
7606
7607 try
7608 {
7609 gl::Context *context = gl::getNonLostContext();
7610
7611 if (context)
7612 {
7613 if (context->getClientVersion() < 3)
7614 {
7615 return gl::error(GL_INVALID_OPERATION);
7616 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007617
Geoff Lang48dcae72014-02-05 16:28:24 -05007618 if (count < 0)
7619 {
7620 return gl::error(GL_INVALID_VALUE);
7621 }
7622
7623 switch (bufferMode)
7624 {
7625 case GL_INTERLEAVED_ATTRIBS:
7626 break;
7627 case GL_SEPARATE_ATTRIBS:
7628 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7629 {
7630 return gl::error(GL_INVALID_VALUE);
7631 }
7632 break;
7633 default:
7634 return gl::error(GL_INVALID_ENUM);
7635 }
7636
7637 if (!gl::ValidProgram(context, program))
7638 {
7639 return;
7640 }
7641
7642 gl::Program *programObject = context->getProgram(program);
7643 ASSERT(programObject);
7644
7645 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007646 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007647 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007648 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007649 {
7650 return gl::error(GL_OUT_OF_MEMORY);
7651 }
7652}
7653
7654void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7655{
7656 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7657 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7658 program, index, bufSize, length, size, type, name);
7659
7660 try
7661 {
7662 gl::Context *context = gl::getNonLostContext();
7663
7664 if (context)
7665 {
7666 if (context->getClientVersion() < 3)
7667 {
7668 return gl::error(GL_INVALID_OPERATION);
7669 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007670
Geoff Lang48dcae72014-02-05 16:28:24 -05007671 if (bufSize < 0)
7672 {
7673 return gl::error(GL_INVALID_VALUE);
7674 }
7675
7676 if (!gl::ValidProgram(context, program))
7677 {
7678 return;
7679 }
7680
7681 gl::Program *programObject = context->getProgram(program);
7682 ASSERT(programObject);
7683
7684 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7685 {
7686 return gl::error(GL_INVALID_VALUE);
7687 }
7688
7689 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007691 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007692 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007693 {
7694 return gl::error(GL_OUT_OF_MEMORY);
7695 }
7696}
7697
7698void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7699{
7700 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7701 index, size, type, stride, pointer);
7702
7703 try
7704 {
7705 gl::Context *context = gl::getNonLostContext();
7706
7707 if (context)
7708 {
7709 if (context->getClientVersion() < 3)
7710 {
7711 return gl::error(GL_INVALID_OPERATION);
7712 }
7713 }
7714
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007715 if (index >= gl::MAX_VERTEX_ATTRIBS)
7716 {
7717 return gl::error(GL_INVALID_VALUE);
7718 }
7719
7720 if (size < 1 || size > 4)
7721 {
7722 return gl::error(GL_INVALID_VALUE);
7723 }
7724
7725 switch (type)
7726 {
7727 case GL_BYTE:
7728 case GL_UNSIGNED_BYTE:
7729 case GL_SHORT:
7730 case GL_UNSIGNED_SHORT:
7731 case GL_INT:
7732 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007733 case GL_INT_2_10_10_10_REV:
7734 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007735 break;
7736 default:
7737 return gl::error(GL_INVALID_ENUM);
7738 }
7739
7740 if (stride < 0)
7741 {
7742 return gl::error(GL_INVALID_VALUE);
7743 }
7744
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007745 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7746 {
7747 return gl::error(GL_INVALID_OPERATION);
7748 }
7749
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007750 if (context)
7751 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007752 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7753 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7754 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7755 // and the pointer argument is not NULL.
7756 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7757 {
7758 return gl::error(GL_INVALID_OPERATION);
7759 }
7760
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007761 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7762 stride, pointer);
7763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007764 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007765 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007766 {
7767 return gl::error(GL_OUT_OF_MEMORY);
7768 }
7769}
7770
7771void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7772{
7773 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7774 index, pname, params);
7775
7776 try
7777 {
7778 gl::Context *context = gl::getNonLostContext();
7779
7780 if (context)
7781 {
7782 if (context->getClientVersion() < 3)
7783 {
7784 return gl::error(GL_INVALID_OPERATION);
7785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007786
Jamie Madilla7d05862013-07-02 11:57:06 -04007787 if (index >= gl::MAX_VERTEX_ATTRIBS)
7788 {
7789 return gl::error(GL_INVALID_VALUE);
7790 }
7791
7792 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7793
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007794 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007795 {
7796 return;
7797 }
7798
7799 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7800 {
7801 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7802 for (int i = 0; i < 4; ++i)
7803 {
7804 params[i] = currentValueData.IntValues[i];
7805 }
7806 }
7807 else
7808 {
7809 *params = attribState.querySingleParameter<GLint>(pname);
7810 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007812 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007813 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007814 {
7815 return gl::error(GL_OUT_OF_MEMORY);
7816 }
7817}
7818
7819void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7820{
7821 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7822 index, pname, params);
7823
7824 try
7825 {
7826 gl::Context *context = gl::getNonLostContext();
7827
7828 if (context)
7829 {
7830 if (context->getClientVersion() < 3)
7831 {
7832 return gl::error(GL_INVALID_OPERATION);
7833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007834
Jamie Madilla7d05862013-07-02 11:57:06 -04007835 if (index >= gl::MAX_VERTEX_ATTRIBS)
7836 {
7837 return gl::error(GL_INVALID_VALUE);
7838 }
7839
7840 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7841
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007842 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007843 {
7844 return;
7845 }
7846
7847 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7848 {
7849 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7850 for (int i = 0; i < 4; ++i)
7851 {
7852 params[i] = currentValueData.UnsignedIntValues[i];
7853 }
7854 }
7855 else
7856 {
7857 *params = attribState.querySingleParameter<GLuint>(pname);
7858 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007859 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007860 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007861 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007862 {
7863 return gl::error(GL_OUT_OF_MEMORY);
7864 }
7865}
7866
7867void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7868{
7869 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7870 index, x, y, z, w);
7871
7872 try
7873 {
7874 gl::Context *context = gl::getNonLostContext();
7875
7876 if (context)
7877 {
7878 if (context->getClientVersion() < 3)
7879 {
7880 return gl::error(GL_INVALID_OPERATION);
7881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007882
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007883 if (index >= gl::MAX_VERTEX_ATTRIBS)
7884 {
7885 return gl::error(GL_INVALID_VALUE);
7886 }
7887
7888 GLint vals[4] = { x, y, z, w };
7889 context->setVertexAttribi(index, vals);
7890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007891 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007892 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007893 {
7894 return gl::error(GL_OUT_OF_MEMORY);
7895 }
7896}
7897
7898void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7899{
7900 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7901 index, x, y, z, w);
7902
7903 try
7904 {
7905 gl::Context *context = gl::getNonLostContext();
7906
7907 if (context)
7908 {
7909 if (context->getClientVersion() < 3)
7910 {
7911 return gl::error(GL_INVALID_OPERATION);
7912 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007913
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007914 if (index >= gl::MAX_VERTEX_ATTRIBS)
7915 {
7916 return gl::error(GL_INVALID_VALUE);
7917 }
7918
7919 GLuint vals[4] = { x, y, z, w };
7920 context->setVertexAttribu(index, vals);
7921 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007922 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007923 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007924 {
7925 return gl::error(GL_OUT_OF_MEMORY);
7926 }
7927}
7928
7929void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7930{
7931 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7932
7933 try
7934 {
7935 gl::Context *context = gl::getNonLostContext();
7936
7937 if (context)
7938 {
7939 if (context->getClientVersion() < 3)
7940 {
7941 return gl::error(GL_INVALID_OPERATION);
7942 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007943
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007944 if (index >= gl::MAX_VERTEX_ATTRIBS)
7945 {
7946 return gl::error(GL_INVALID_VALUE);
7947 }
7948
7949 context->setVertexAttribi(index, v);
7950 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007951 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007952 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007953 {
7954 return gl::error(GL_OUT_OF_MEMORY);
7955 }
7956}
7957
7958void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7959{
7960 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7961
7962 try
7963 {
7964 gl::Context *context = gl::getNonLostContext();
7965
7966 if (context)
7967 {
7968 if (context->getClientVersion() < 3)
7969 {
7970 return gl::error(GL_INVALID_OPERATION);
7971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007972
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007973 if (index >= gl::MAX_VERTEX_ATTRIBS)
7974 {
7975 return gl::error(GL_INVALID_VALUE);
7976 }
7977
7978 context->setVertexAttribu(index, v);
7979 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007980 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007981 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007982 {
7983 return gl::error(GL_OUT_OF_MEMORY);
7984 }
7985}
7986
7987void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7988{
7989 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7990 program, location, params);
7991
7992 try
7993 {
7994 gl::Context *context = gl::getNonLostContext();
7995
7996 if (context)
7997 {
7998 if (context->getClientVersion() < 3)
7999 {
8000 return gl::error(GL_INVALID_OPERATION);
8001 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008002
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008003 if (program == 0)
8004 {
8005 return gl::error(GL_INVALID_VALUE);
8006 }
8007
8008 gl::Program *programObject = context->getProgram(program);
8009
8010 if (!programObject || !programObject->isLinked())
8011 {
8012 return gl::error(GL_INVALID_OPERATION);
8013 }
8014
8015 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8016 if (!programBinary)
8017 {
8018 return gl::error(GL_INVALID_OPERATION);
8019 }
8020
8021 if (!programBinary->getUniformuiv(location, NULL, params))
8022 {
8023 return gl::error(GL_INVALID_OPERATION);
8024 }
8025 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008026 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008027 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008028 {
8029 return gl::error(GL_OUT_OF_MEMORY);
8030 }
8031}
8032
8033GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
8034{
8035 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
8036 program, name);
8037
8038 try
8039 {
8040 gl::Context *context = gl::getNonLostContext();
8041
8042 if (context)
8043 {
8044 if (context->getClientVersion() < 3)
8045 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04008046 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008047 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008048
Jamie Madilld1e78c92013-06-20 11:55:50 -04008049 if (program == 0)
8050 {
8051 return gl::error(GL_INVALID_VALUE, -1);
8052 }
8053
8054 gl::Program *programObject = context->getProgram(program);
8055
8056 if (!programObject || !programObject->isLinked())
8057 {
8058 return gl::error(GL_INVALID_OPERATION, -1);
8059 }
8060
8061 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8062 if (!programBinary)
8063 {
8064 return gl::error(GL_INVALID_OPERATION, -1);
8065 }
8066
8067 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008069 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008070 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008071 {
8072 return gl::error(GL_OUT_OF_MEMORY, 0);
8073 }
8074
8075 return 0;
8076}
8077
8078void __stdcall glUniform1ui(GLint location, GLuint v0)
8079{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008080 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008081}
8082
8083void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
8084{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008085 const GLuint xy[] = { v0, v1 };
8086 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008087}
8088
8089void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
8090{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008091 const GLuint xyz[] = { v0, v1, v2 };
8092 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008093}
8094
8095void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
8096{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00008097 const GLuint xyzw[] = { v0, v1, v2, v3 };
8098 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008099}
8100
8101void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
8102{
8103 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8104 location, count, value);
8105
8106 try
8107 {
8108 gl::Context *context = gl::getNonLostContext();
8109
8110 if (context)
8111 {
8112 if (context->getClientVersion() < 3)
8113 {
8114 return gl::error(GL_INVALID_OPERATION);
8115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008116
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008117 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8118 if (!programBinary)
8119 {
8120 return gl::error(GL_INVALID_OPERATION);
8121 }
8122
8123 if (!programBinary->setUniform1uiv(location, count, value))
8124 {
8125 return gl::error(GL_INVALID_OPERATION);
8126 }
8127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008128 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008129 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008130 {
8131 return gl::error(GL_OUT_OF_MEMORY);
8132 }
8133}
8134
8135void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
8136{
8137 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8138 location, count, value);
8139
8140 try
8141 {
8142 gl::Context *context = gl::getNonLostContext();
8143
8144 if (context)
8145 {
8146 if (context->getClientVersion() < 3)
8147 {
8148 return gl::error(GL_INVALID_OPERATION);
8149 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008150
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008151 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8152 if (!programBinary)
8153 {
8154 return gl::error(GL_INVALID_OPERATION);
8155 }
8156
8157 if (!programBinary->setUniform2uiv(location, count, value))
8158 {
8159 return gl::error(GL_INVALID_OPERATION);
8160 }
8161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008162 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008163 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164 {
8165 return gl::error(GL_OUT_OF_MEMORY);
8166 }
8167}
8168
8169void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
8170{
8171 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
8172 location, count, value);
8173
8174 try
8175 {
8176 gl::Context *context = gl::getNonLostContext();
8177
8178 if (context)
8179 {
8180 if (context->getClientVersion() < 3)
8181 {
8182 return gl::error(GL_INVALID_OPERATION);
8183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008185 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8186 if (!programBinary)
8187 {
8188 return gl::error(GL_INVALID_OPERATION);
8189 }
8190
8191 if (!programBinary->setUniform3uiv(location, count, value))
8192 {
8193 return gl::error(GL_INVALID_OPERATION);
8194 }
8195 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008196 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008197 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008198 {
8199 return gl::error(GL_OUT_OF_MEMORY);
8200 }
8201}
8202
8203void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
8204{
8205 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
8206 location, count, value);
8207
8208 try
8209 {
8210 gl::Context *context = gl::getNonLostContext();
8211
8212 if (context)
8213 {
8214 if (context->getClientVersion() < 3)
8215 {
8216 return gl::error(GL_INVALID_OPERATION);
8217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008218
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00008219 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8220 if (!programBinary)
8221 {
8222 return gl::error(GL_INVALID_OPERATION);
8223 }
8224
8225 if (!programBinary->setUniform4uiv(location, count, value))
8226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
8229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008230 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008231 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008232 {
8233 return gl::error(GL_OUT_OF_MEMORY);
8234 }
8235}
8236
8237void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
8238{
8239 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
8240 buffer, drawbuffer, value);
8241
8242 try
8243 {
8244 gl::Context *context = gl::getNonLostContext();
8245
8246 if (context)
8247 {
8248 if (context->getClientVersion() < 3)
8249 {
8250 return gl::error(GL_INVALID_OPERATION);
8251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008252
Geoff Lang42359ca2013-08-21 13:25:17 -04008253 switch (buffer)
8254 {
8255 case GL_COLOR:
8256 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8257 {
8258 return gl::error(GL_INVALID_VALUE);
8259 }
8260 break;
8261 case GL_STENCIL:
8262 if (drawbuffer != 0)
8263 {
8264 return gl::error(GL_INVALID_VALUE);
8265 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05008266 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04008267 default:
8268 return gl::error(GL_INVALID_ENUM);
8269 }
8270
8271 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008272 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008273 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008274 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008275 {
8276 return gl::error(GL_OUT_OF_MEMORY);
8277 }
8278}
8279
8280void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
8281{
8282 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
8283 buffer, drawbuffer, value);
8284
8285 try
8286 {
8287 gl::Context *context = gl::getNonLostContext();
8288
8289 if (context)
8290 {
8291 if (context->getClientVersion() < 3)
8292 {
8293 return gl::error(GL_INVALID_OPERATION);
8294 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008295
Geoff Lang42359ca2013-08-21 13:25:17 -04008296 switch (buffer)
8297 {
8298 case GL_COLOR:
8299 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8300 {
8301 return gl::error(GL_INVALID_VALUE);
8302 }
8303 break;
8304 default:
8305 return gl::error(GL_INVALID_ENUM);
8306 }
8307
8308 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008310 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008311 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008312 {
8313 return gl::error(GL_OUT_OF_MEMORY);
8314 }
8315}
8316
8317void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8318{
8319 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8320 buffer, drawbuffer, value);
8321
8322 try
8323 {
8324 gl::Context *context = gl::getNonLostContext();
8325
8326 if (context)
8327 {
8328 if (context->getClientVersion() < 3)
8329 {
8330 return gl::error(GL_INVALID_OPERATION);
8331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008332
Geoff Lang42359ca2013-08-21 13:25:17 -04008333 switch (buffer)
8334 {
8335 case GL_COLOR:
8336 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8337 {
8338 return gl::error(GL_INVALID_VALUE);
8339 }
8340 break;
8341 case GL_DEPTH:
8342 if (drawbuffer != 0)
8343 {
8344 return gl::error(GL_INVALID_VALUE);
8345 }
8346 break;
8347 default:
8348 return gl::error(GL_INVALID_ENUM);
8349 }
8350
8351 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008352 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008353 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008354 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008355 {
8356 return gl::error(GL_OUT_OF_MEMORY);
8357 }
8358}
8359
8360void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8361{
8362 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8363 buffer, drawbuffer, depth, stencil);
8364
8365 try
8366 {
8367 gl::Context *context = gl::getNonLostContext();
8368
8369 if (context)
8370 {
8371 if (context->getClientVersion() < 3)
8372 {
8373 return gl::error(GL_INVALID_OPERATION);
8374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008375
Geoff Lang42359ca2013-08-21 13:25:17 -04008376 switch (buffer)
8377 {
8378 case GL_DEPTH_STENCIL:
8379 if (drawbuffer != 0)
8380 {
8381 return gl::error(GL_INVALID_VALUE);
8382 }
8383 break;
8384 default:
8385 return gl::error(GL_INVALID_ENUM);
8386 }
8387
8388 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008390 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008391 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008392 {
8393 return gl::error(GL_OUT_OF_MEMORY);
8394 }
8395}
8396
8397const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8398{
8399 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8400
8401 try
8402 {
8403 gl::Context *context = gl::getNonLostContext();
8404
8405 if (context)
8406 {
8407 if (context->getClientVersion() < 3)
8408 {
8409 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008411
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008412 if (name != GL_EXTENSIONS)
8413 {
8414 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8415 }
8416
8417 if (index >= context->getNumExtensions())
8418 {
8419 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8420 }
8421
8422 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008424 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008425 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008426 {
8427 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8428 }
8429
8430 return NULL;
8431}
8432
8433void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8434{
8435 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8436 readTarget, writeTarget, readOffset, writeOffset, size);
8437
8438 try
8439 {
8440 gl::Context *context = gl::getNonLostContext();
8441
8442 if (context)
8443 {
8444 if (context->getClientVersion() < 3)
8445 {
8446 return gl::error(GL_INVALID_OPERATION);
8447 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008448
Jamie Madill8c96d582014-03-05 15:01:23 -05008449 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008450 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008451 return gl::error(GL_INVALID_ENUM);
8452 }
8453
Jamie Madill8c96d582014-03-05 15:01:23 -05008454 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8455 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008456
8457 if (!readBuffer || !writeBuffer)
8458 {
8459 return gl::error(GL_INVALID_OPERATION);
8460 }
8461
Jamie Madill7a5f7382014-03-05 15:01:24 -05008462 if (readBuffer->mapped() || writeBuffer->mapped())
8463 {
8464 return gl::error(GL_INVALID_OPERATION);
8465 }
8466
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008467 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8468 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8469 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8470 {
8471 return gl::error(GL_INVALID_VALUE);
8472 }
8473
8474 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8475 {
8476 return gl::error(GL_INVALID_VALUE);
8477 }
8478
8479 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8480
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008481 // if size is zero, the copy is a successful no-op
8482 if (size > 0)
8483 {
8484 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8485 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008486 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008487 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008488 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008489 {
8490 return gl::error(GL_OUT_OF_MEMORY);
8491 }
8492}
8493
8494void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8495{
8496 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8497 program, uniformCount, uniformNames, uniformIndices);
8498
8499 try
8500 {
8501 gl::Context *context = gl::getNonLostContext();
8502
8503 if (context)
8504 {
8505 if (context->getClientVersion() < 3)
8506 {
8507 return gl::error(GL_INVALID_OPERATION);
8508 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008509
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008510 if (uniformCount < 0)
8511 {
8512 return gl::error(GL_INVALID_VALUE);
8513 }
8514
8515 gl::Program *programObject = context->getProgram(program);
8516
8517 if (!programObject)
8518 {
8519 if (context->getShader(program))
8520 {
8521 return gl::error(GL_INVALID_OPERATION);
8522 }
8523 else
8524 {
8525 return gl::error(GL_INVALID_VALUE);
8526 }
8527 }
8528
8529 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8530 if (!programObject->isLinked() || !programBinary)
8531 {
8532 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8533 {
8534 uniformIndices[uniformId] = GL_INVALID_INDEX;
8535 }
8536 }
8537 else
8538 {
8539 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8540 {
8541 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8542 }
8543 }
8544 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008545 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008546 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008547 {
8548 return gl::error(GL_OUT_OF_MEMORY);
8549 }
8550}
8551
8552void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8553{
8554 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8555 program, uniformCount, uniformIndices, pname, params);
8556
8557 try
8558 {
8559 gl::Context *context = gl::getNonLostContext();
8560
8561 if (context)
8562 {
8563 if (context->getClientVersion() < 3)
8564 {
8565 return gl::error(GL_INVALID_OPERATION);
8566 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008567
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008568 if (uniformCount < 0)
8569 {
8570 return gl::error(GL_INVALID_VALUE);
8571 }
8572
8573 gl::Program *programObject = context->getProgram(program);
8574
8575 if (!programObject)
8576 {
8577 if (context->getShader(program))
8578 {
8579 return gl::error(GL_INVALID_OPERATION);
8580 }
8581 else
8582 {
8583 return gl::error(GL_INVALID_VALUE);
8584 }
8585 }
8586
8587 switch (pname)
8588 {
8589 case GL_UNIFORM_TYPE:
8590 case GL_UNIFORM_SIZE:
8591 case GL_UNIFORM_NAME_LENGTH:
8592 case GL_UNIFORM_BLOCK_INDEX:
8593 case GL_UNIFORM_OFFSET:
8594 case GL_UNIFORM_ARRAY_STRIDE:
8595 case GL_UNIFORM_MATRIX_STRIDE:
8596 case GL_UNIFORM_IS_ROW_MAJOR:
8597 break;
8598 default:
8599 return gl::error(GL_INVALID_ENUM);
8600 }
8601
8602 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8603
8604 if (!programBinary && uniformCount > 0)
8605 {
8606 return gl::error(GL_INVALID_VALUE);
8607 }
8608
8609 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8610 {
8611 const GLuint index = uniformIndices[uniformId];
8612
8613 if (index >= (GLuint)programBinary->getActiveUniformCount())
8614 {
8615 return gl::error(GL_INVALID_VALUE);
8616 }
8617 }
8618
8619 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8620 {
8621 const GLuint index = uniformIndices[uniformId];
8622 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8623 }
8624 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008625 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008626 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008627 {
8628 return gl::error(GL_OUT_OF_MEMORY);
8629 }
8630}
8631
8632GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8633{
8634 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8635
8636 try
8637 {
8638 gl::Context *context = gl::getNonLostContext();
8639
8640 if (context)
8641 {
8642 if (context->getClientVersion() < 3)
8643 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008644 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008646
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008647 gl::Program *programObject = context->getProgram(program);
8648
8649 if (!programObject)
8650 {
8651 if (context->getShader(program))
8652 {
8653 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8654 }
8655 else
8656 {
8657 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8658 }
8659 }
8660
8661 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8662 if (!programBinary)
8663 {
8664 return GL_INVALID_INDEX;
8665 }
8666
8667 return programBinary->getUniformBlockIndex(uniformBlockName);
8668 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008669 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008670 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008671 {
8672 return gl::error(GL_OUT_OF_MEMORY, 0);
8673 }
8674
8675 return 0;
8676}
8677
8678void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8679{
8680 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8681 program, uniformBlockIndex, pname, params);
8682
8683 try
8684 {
8685 gl::Context *context = gl::getNonLostContext();
8686
8687 if (context)
8688 {
8689 if (context->getClientVersion() < 3)
8690 {
8691 return gl::error(GL_INVALID_OPERATION);
8692 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008693 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008694
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008695 if (!programObject)
8696 {
8697 if (context->getShader(program))
8698 {
8699 return gl::error(GL_INVALID_OPERATION);
8700 }
8701 else
8702 {
8703 return gl::error(GL_INVALID_VALUE);
8704 }
8705 }
8706
8707 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8708
8709 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8710 {
8711 return gl::error(GL_INVALID_VALUE);
8712 }
8713
8714 switch (pname)
8715 {
8716 case GL_UNIFORM_BLOCK_BINDING:
8717 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8718 break;
8719
8720 case GL_UNIFORM_BLOCK_DATA_SIZE:
8721 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8722 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8723 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8724 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8725 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8726 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8727 break;
8728
8729 default:
8730 return gl::error(GL_INVALID_ENUM);
8731 }
8732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008733 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008734 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008735 {
8736 return gl::error(GL_OUT_OF_MEMORY);
8737 }
8738}
8739
8740void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8741{
8742 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8743 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8744
8745 try
8746 {
8747 gl::Context *context = gl::getNonLostContext();
8748
8749 if (context)
8750 {
8751 if (context->getClientVersion() < 3)
8752 {
8753 return gl::error(GL_INVALID_OPERATION);
8754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008755
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008756 gl::Program *programObject = context->getProgram(program);
8757
8758 if (!programObject)
8759 {
8760 if (context->getShader(program))
8761 {
8762 return gl::error(GL_INVALID_OPERATION);
8763 }
8764 else
8765 {
8766 return gl::error(GL_INVALID_VALUE);
8767 }
8768 }
8769
8770 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8771
8772 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8773 {
8774 return gl::error(GL_INVALID_VALUE);
8775 }
8776
8777 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8778 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008779 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008780 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008781 {
8782 return gl::error(GL_OUT_OF_MEMORY);
8783 }
8784}
8785
8786void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8787{
8788 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8789 program, uniformBlockIndex, uniformBlockBinding);
8790
8791 try
8792 {
8793 gl::Context *context = gl::getNonLostContext();
8794
8795 if (context)
8796 {
8797 if (context->getClientVersion() < 3)
8798 {
8799 return gl::error(GL_INVALID_OPERATION);
8800 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008801
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008802 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8803 {
8804 return gl::error(GL_INVALID_VALUE);
8805 }
8806
8807 gl::Program *programObject = context->getProgram(program);
8808
8809 if (!programObject)
8810 {
8811 if (context->getShader(program))
8812 {
8813 return gl::error(GL_INVALID_OPERATION);
8814 }
8815 else
8816 {
8817 return gl::error(GL_INVALID_VALUE);
8818 }
8819 }
8820
8821 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8822
8823 // if never linked, there won't be any uniform blocks
8824 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8825 {
8826 return gl::error(GL_INVALID_VALUE);
8827 }
8828
8829 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008831 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008832 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008833 {
8834 return gl::error(GL_OUT_OF_MEMORY);
8835 }
8836}
8837
8838void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8839{
8840 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8841 mode, first, count, instanceCount);
8842
8843 try
8844 {
8845 gl::Context *context = gl::getNonLostContext();
8846
8847 if (context)
8848 {
8849 if (context->getClientVersion() < 3)
8850 {
8851 return gl::error(GL_INVALID_OPERATION);
8852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008853
Jamie Madill54133512013-06-21 09:33:07 -04008854 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008855 UNIMPLEMENTED();
8856 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008857 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008858 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859 {
8860 return gl::error(GL_OUT_OF_MEMORY);
8861 }
8862}
8863
8864void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8865{
8866 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8867 mode, count, type, indices, instanceCount);
8868
8869 try
8870 {
8871 gl::Context *context = gl::getNonLostContext();
8872
8873 if (context)
8874 {
8875 if (context->getClientVersion() < 3)
8876 {
8877 return gl::error(GL_INVALID_OPERATION);
8878 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008879
Jamie Madill54133512013-06-21 09:33:07 -04008880 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008881 UNIMPLEMENTED();
8882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008884 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885 {
8886 return gl::error(GL_OUT_OF_MEMORY);
8887 }
8888}
8889
8890GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8891{
8892 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8893
8894 try
8895 {
8896 gl::Context *context = gl::getNonLostContext();
8897
8898 if (context)
8899 {
8900 if (context->getClientVersion() < 3)
8901 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008902 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008904
Jamie Madill5215e1a2013-07-26 11:55:19 -04008905 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8906 {
8907 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8908 }
8909
8910 if (flags != 0)
8911 {
8912 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8913 }
8914
8915 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008916 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008917 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008918 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008919 {
8920 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8921 }
8922
8923 return NULL;
8924}
8925
8926GLboolean __stdcall glIsSync(GLsync sync)
8927{
8928 EVENT("(GLsync sync = 0x%0.8p)", sync);
8929
8930 try
8931 {
8932 gl::Context *context = gl::getNonLostContext();
8933
8934 if (context)
8935 {
8936 if (context->getClientVersion() < 3)
8937 {
8938 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008940
Jamie Madill5215e1a2013-07-26 11:55:19 -04008941 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008942 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008943 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008944 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008945 {
8946 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8947 }
8948
8949 return GL_FALSE;
8950}
8951
8952void __stdcall glDeleteSync(GLsync sync)
8953{
8954 EVENT("(GLsync sync = 0x%0.8p)", sync);
8955
8956 try
8957 {
8958 gl::Context *context = gl::getNonLostContext();
8959
8960 if (context)
8961 {
8962 if (context->getClientVersion() < 3)
8963 {
8964 return gl::error(GL_INVALID_OPERATION);
8965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008966
Jamie Madill5215e1a2013-07-26 11:55:19 -04008967 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8968 {
8969 return gl::error(GL_INVALID_VALUE);
8970 }
8971
8972 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008974 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008975 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008976 {
8977 return gl::error(GL_OUT_OF_MEMORY);
8978 }
8979}
8980
8981GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8982{
8983 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8984 sync, flags, timeout);
8985
8986 try
8987 {
8988 gl::Context *context = gl::getNonLostContext();
8989
8990 if (context)
8991 {
8992 if (context->getClientVersion() < 3)
8993 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008994 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008996
Jamie Madill5215e1a2013-07-26 11:55:19 -04008997 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8998 {
8999 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9000 }
9001
9002 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9003
9004 if (!fenceSync)
9005 {
9006 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
9007 }
9008
9009 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009011 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009012 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009013 {
9014 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9015 }
9016
9017 return GL_FALSE;
9018}
9019
9020void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9021{
9022 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9023 sync, flags, timeout);
9024
9025 try
9026 {
9027 gl::Context *context = gl::getNonLostContext();
9028
9029 if (context)
9030 {
9031 if (context->getClientVersion() < 3)
9032 {
9033 return gl::error(GL_INVALID_OPERATION);
9034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009035
Jamie Madill5215e1a2013-07-26 11:55:19 -04009036 if (flags != 0)
9037 {
9038 return gl::error(GL_INVALID_VALUE);
9039 }
9040
9041 if (timeout != GL_TIMEOUT_IGNORED)
9042 {
9043 return gl::error(GL_INVALID_VALUE);
9044 }
9045
9046 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9047
9048 if (!fenceSync)
9049 {
9050 return gl::error(GL_INVALID_VALUE);
9051 }
9052
9053 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009055 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009056 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009057 {
9058 return gl::error(GL_OUT_OF_MEMORY);
9059 }
9060}
9061
9062void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9063{
9064 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9065 pname, params);
9066
9067 try
9068 {
9069 gl::Context *context = gl::getNonLostContext();
9070
9071 if (context)
9072 {
9073 if (context->getClientVersion() < 3)
9074 {
9075 return gl::error(GL_INVALID_OPERATION);
9076 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009077
Jamie Madill79f2f452013-12-19 11:13:02 -05009078 GLenum nativeType;
9079 unsigned int numParams = 0;
9080 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
9081 return gl::error(GL_INVALID_ENUM);
9082
9083 // pname is valid, but that there are no parameters to return.
9084 if (numParams == 0)
9085 return;
9086
9087 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04009088 {
Jamie Madill79f2f452013-12-19 11:13:02 -05009089 context->getInteger64v(pname, params);
9090 }
Jamie Madill55856b12014-01-02 13:59:50 -05009091 else
Jamie Madill79f2f452013-12-19 11:13:02 -05009092 {
Jamie Madill55856b12014-01-02 13:59:50 -05009093 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04009094 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009095 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009096 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009097 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009098 {
9099 return gl::error(GL_OUT_OF_MEMORY);
9100 }
9101}
9102
9103void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9104{
9105 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9106 sync, pname, bufSize, length, values);
9107
9108 try
9109 {
9110 gl::Context *context = gl::getNonLostContext();
9111
9112 if (context)
9113 {
9114 if (context->getClientVersion() < 3)
9115 {
9116 return gl::error(GL_INVALID_OPERATION);
9117 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009118
Jamie Madill5215e1a2013-07-26 11:55:19 -04009119 if (bufSize < 0)
9120 {
9121 return gl::error(GL_INVALID_VALUE);
9122 }
9123
9124 gl::FenceSync *fenceSync = context->getFenceSync(sync);
9125
9126 if (!fenceSync)
9127 {
9128 return gl::error(GL_INVALID_VALUE);
9129 }
9130
9131 switch (pname)
9132 {
9133 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
9134 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
9135 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
9136 case GL_SYNC_FLAGS: values[0] = 0; break;
9137
9138 default:
9139 return gl::error(GL_INVALID_ENUM);
9140 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009141 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009142 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009143 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009144 {
9145 return gl::error(GL_OUT_OF_MEMORY);
9146 }
9147}
9148
9149void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9150{
9151 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9152 target, index, data);
9153
9154 try
9155 {
9156 gl::Context *context = gl::getNonLostContext();
9157
9158 if (context)
9159 {
9160 if (context->getClientVersion() < 3)
9161 {
9162 return gl::error(GL_INVALID_OPERATION);
9163 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009164
Shannon Woods15934d52013-08-19 14:28:49 -04009165 switch (target)
9166 {
9167 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
9168 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
9169 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9170 if (index >= context->getMaxTransformFeedbackBufferBindings())
9171 return gl::error(GL_INVALID_VALUE);
9172 break;
9173 case GL_UNIFORM_BUFFER_START:
9174 case GL_UNIFORM_BUFFER_SIZE:
9175 case GL_UNIFORM_BUFFER_BINDING:
9176 if (index >= context->getMaximumCombinedUniformBufferBindings())
9177 return gl::error(GL_INVALID_VALUE);
9178 break;
9179 default:
9180 return gl::error(GL_INVALID_ENUM);
9181 }
9182
9183 if (!(context->getIndexedInteger64v(target, index, data)))
9184 {
9185 GLenum nativeType;
9186 unsigned int numParams = 0;
9187 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
9188 return gl::error(GL_INVALID_ENUM);
9189
9190 if (numParams == 0)
9191 return; // it is known that pname is valid, but there are no parameters to return
9192
9193 if (nativeType == GL_INT)
9194 {
9195 GLint *intParams = new GLint[numParams];
9196
9197 context->getIndexedIntegerv(target, index, intParams);
9198
9199 for (unsigned int i = 0; i < numParams; ++i)
9200 {
9201 data[i] = static_cast<GLint64>(intParams[i]);
9202 }
9203
9204 delete [] intParams;
9205 }
9206 else
9207 {
9208 UNREACHABLE();
9209 }
9210 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009211 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009212 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009213 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009214 {
9215 return gl::error(GL_OUT_OF_MEMORY);
9216 }
9217}
9218
9219void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9220{
9221 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9222 target, pname, params);
9223
9224 try
9225 {
9226 gl::Context *context = gl::getNonLostContext();
9227
9228 if (context)
9229 {
9230 if (context->getClientVersion() < 3)
9231 {
9232 return gl::error(GL_INVALID_OPERATION);
9233 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009234
Jamie Madill70656a62014-03-05 15:01:26 -05009235 if (!gl::ValidBufferTarget(context, target))
9236 {
9237 return gl::error(GL_INVALID_ENUM);
9238 }
9239
9240 if (!gl::ValidBufferParameter(context, pname))
9241 {
9242 return gl::error(GL_INVALID_ENUM);
9243 }
9244
9245 gl::Buffer *buffer = context->getTargetBuffer(target);
9246
9247 if (!buffer)
9248 {
9249 // A null buffer means that "0" is bound to the requested buffer target
9250 return gl::error(GL_INVALID_OPERATION);
9251 }
9252
9253 switch (pname)
9254 {
9255 case GL_BUFFER_USAGE:
9256 *params = static_cast<GLint64>(buffer->usage());
9257 break;
9258 case GL_BUFFER_SIZE:
9259 *params = buffer->size();
9260 break;
9261 case GL_BUFFER_ACCESS_FLAGS:
9262 *params = static_cast<GLint64>(buffer->accessFlags());
9263 break;
9264 case GL_BUFFER_MAPPED:
9265 *params = static_cast<GLint64>(buffer->mapped());
9266 break;
9267 case GL_BUFFER_MAP_OFFSET:
9268 *params = buffer->mapOffset();
9269 break;
9270 case GL_BUFFER_MAP_LENGTH:
9271 *params = buffer->mapLength();
9272 break;
9273 default: UNREACHABLE(); break;
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 glGenSamplers(GLsizei count, GLuint* samplers)
9284{
9285 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
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
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009298 if (count < 0)
9299 {
9300 return gl::error(GL_INVALID_VALUE);
9301 }
9302
9303 for (int i = 0; i < count; i++)
9304 {
9305 samplers[i] = context->createSampler();
9306 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009309 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009310 {
9311 return gl::error(GL_OUT_OF_MEMORY);
9312 }
9313}
9314
9315void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9316{
9317 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9318
9319 try
9320 {
9321 gl::Context *context = gl::getNonLostContext();
9322
9323 if (context)
9324 {
9325 if (context->getClientVersion() < 3)
9326 {
9327 return gl::error(GL_INVALID_OPERATION);
9328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009329
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009330 if (count < 0)
9331 {
9332 return gl::error(GL_INVALID_VALUE);
9333 }
9334
9335 for (int i = 0; i < count; i++)
9336 {
9337 context->deleteSampler(samplers[i]);
9338 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009340 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009341 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009342 {
9343 return gl::error(GL_OUT_OF_MEMORY);
9344 }
9345}
9346
9347GLboolean __stdcall glIsSampler(GLuint sampler)
9348{
9349 EVENT("(GLuint sampler = %u)", sampler);
9350
9351 try
9352 {
9353 gl::Context *context = gl::getNonLostContext();
9354
9355 if (context)
9356 {
9357 if (context->getClientVersion() < 3)
9358 {
9359 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9360 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009361
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009362 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009364 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009365 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009366 {
9367 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9368 }
9369
9370 return GL_FALSE;
9371}
9372
9373void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9374{
9375 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9376
9377 try
9378 {
9379 gl::Context *context = gl::getNonLostContext();
9380
9381 if (context)
9382 {
9383 if (context->getClientVersion() < 3)
9384 {
9385 return gl::error(GL_INVALID_OPERATION);
9386 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009387
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009388 if (sampler != 0 && !context->isSampler(sampler))
9389 {
9390 return gl::error(GL_INVALID_OPERATION);
9391 }
9392
9393 if (unit >= context->getMaximumCombinedTextureImageUnits())
9394 {
9395 return gl::error(GL_INVALID_VALUE);
9396 }
9397
9398 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009399 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009400 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009401 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009402 {
9403 return gl::error(GL_OUT_OF_MEMORY);
9404 }
9405}
9406
9407void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9408{
9409 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9410
9411 try
9412 {
9413 gl::Context *context = gl::getNonLostContext();
9414
9415 if (context)
9416 {
9417 if (context->getClientVersion() < 3)
9418 {
9419 return gl::error(GL_INVALID_OPERATION);
9420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009421
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009422 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009423 {
9424 return;
9425 }
9426
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009427 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009428 {
9429 return;
9430 }
9431
9432 if (!context->isSampler(sampler))
9433 {
9434 return gl::error(GL_INVALID_OPERATION);
9435 }
9436
9437 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009438 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009439 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009440 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009441 {
9442 return gl::error(GL_OUT_OF_MEMORY);
9443 }
9444}
9445
9446void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9447{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009448 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009449}
9450
9451void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9452{
9453 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9454
9455 try
9456 {
9457 gl::Context *context = gl::getNonLostContext();
9458
9459 if (context)
9460 {
9461 if (context->getClientVersion() < 3)
9462 {
9463 return gl::error(GL_INVALID_OPERATION);
9464 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009465
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009466 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009467 {
9468 return;
9469 }
9470
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009471 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009472 {
9473 return;
9474 }
9475
9476 if (!context->isSampler(sampler))
9477 {
9478 return gl::error(GL_INVALID_OPERATION);
9479 }
9480
9481 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009483 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009484 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009485 {
9486 return gl::error(GL_OUT_OF_MEMORY);
9487 }
9488}
9489
9490void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9491{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009492 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009493}
9494
9495void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9496{
9497 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9498
9499 try
9500 {
9501 gl::Context *context = gl::getNonLostContext();
9502
9503 if (context)
9504 {
9505 if (context->getClientVersion() < 3)
9506 {
9507 return gl::error(GL_INVALID_OPERATION);
9508 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009509
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009510 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009511 {
9512 return;
9513 }
9514
9515 if (!context->isSampler(sampler))
9516 {
9517 return gl::error(GL_INVALID_OPERATION);
9518 }
9519
9520 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009522 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009523 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009524 {
9525 return gl::error(GL_OUT_OF_MEMORY);
9526 }
9527}
9528
9529void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9530{
9531 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9532
9533 try
9534 {
9535 gl::Context *context = gl::getNonLostContext();
9536
9537 if (context)
9538 {
9539 if (context->getClientVersion() < 3)
9540 {
9541 return gl::error(GL_INVALID_OPERATION);
9542 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009543
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009544 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009545 {
9546 return;
9547 }
9548
9549 if (!context->isSampler(sampler))
9550 {
9551 return gl::error(GL_INVALID_OPERATION);
9552 }
9553
9554 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009555 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009556 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009557 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009558 {
9559 return gl::error(GL_OUT_OF_MEMORY);
9560 }
9561}
9562
9563void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9564{
9565 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9566
9567 try
9568 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009569 if (index >= gl::MAX_VERTEX_ATTRIBS)
9570 {
9571 return gl::error(GL_INVALID_VALUE);
9572 }
9573
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009574 gl::Context *context = gl::getNonLostContext();
9575
9576 if (context)
9577 {
9578 if (context->getClientVersion() < 3)
9579 {
9580 return gl::error(GL_INVALID_OPERATION);
9581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009582
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009583 context->setVertexAttribDivisor(index, divisor);
9584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009585 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009586 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009587 {
9588 return gl::error(GL_OUT_OF_MEMORY);
9589 }
9590}
9591
9592void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9593{
9594 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
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 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009606
Geoff Langc8058452014-02-03 12:04:11 -05009607 switch (target)
9608 {
9609 case GL_TRANSFORM_FEEDBACK:
9610 {
9611 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9612 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9613 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9614 {
9615 return gl::error(GL_INVALID_OPERATION);
9616 }
9617
9618 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9619 if (context->getTransformFeedback(id) == NULL)
9620 {
9621 return gl::error(GL_INVALID_OPERATION);
9622 }
9623
9624 context->bindTransformFeedback(id);
9625 }
9626 break;
9627
9628 default:
9629 return gl::error(GL_INVALID_ENUM);
9630 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +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 glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9640{
9641 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9642
9643 try
9644 {
9645 gl::Context *context = gl::getNonLostContext();
9646
9647 if (context)
9648 {
9649 if (context->getClientVersion() < 3)
9650 {
9651 return gl::error(GL_INVALID_OPERATION);
9652 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009653
Geoff Langc8058452014-02-03 12:04:11 -05009654 for (int i = 0; i < n; i++)
9655 {
9656 context->deleteTransformFeedback(ids[i]);
9657 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009659 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009660 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009661 {
9662 return gl::error(GL_OUT_OF_MEMORY);
9663 }
9664}
9665
9666void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9667{
9668 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9669
9670 try
9671 {
9672 gl::Context *context = gl::getNonLostContext();
9673
9674 if (context)
9675 {
9676 if (context->getClientVersion() < 3)
9677 {
9678 return gl::error(GL_INVALID_OPERATION);
9679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009680
Geoff Langc8058452014-02-03 12:04:11 -05009681 for (int i = 0; i < n; i++)
9682 {
9683 ids[i] = context->createTransformFeedback();
9684 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009685 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009686 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009687 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009688 {
9689 return gl::error(GL_OUT_OF_MEMORY);
9690 }
9691}
9692
9693GLboolean __stdcall glIsTransformFeedback(GLuint id)
9694{
9695 EVENT("(GLuint id = %u)", id);
9696
9697 try
9698 {
9699 gl::Context *context = gl::getNonLostContext();
9700
9701 if (context)
9702 {
9703 if (context->getClientVersion() < 3)
9704 {
9705 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9706 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009707
Geoff Langc8058452014-02-03 12:04:11 -05009708 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009710 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009711 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009712 {
9713 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9714 }
9715
9716 return GL_FALSE;
9717}
9718
9719void __stdcall glPauseTransformFeedback(void)
9720{
9721 EVENT("(void)");
9722
9723 try
9724 {
9725 gl::Context *context = gl::getNonLostContext();
9726
9727 if (context)
9728 {
9729 if (context->getClientVersion() < 3)
9730 {
9731 return gl::error(GL_INVALID_OPERATION);
9732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009733
Geoff Langc8058452014-02-03 12:04:11 -05009734 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9735 ASSERT(transformFeedback != NULL);
9736
9737 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9738 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9739 {
9740 return gl::error(GL_INVALID_OPERATION);
9741 }
9742
9743 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009745 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009746 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009747 {
9748 return gl::error(GL_OUT_OF_MEMORY);
9749 }
9750}
9751
9752void __stdcall glResumeTransformFeedback(void)
9753{
9754 EVENT("(void)");
9755
9756 try
9757 {
9758 gl::Context *context = gl::getNonLostContext();
9759
9760 if (context)
9761 {
9762 if (context->getClientVersion() < 3)
9763 {
9764 return gl::error(GL_INVALID_OPERATION);
9765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009766
Geoff Langc8058452014-02-03 12:04:11 -05009767 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9768 ASSERT(transformFeedback != NULL);
9769
9770 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9771 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9772 {
9773 return gl::error(GL_INVALID_OPERATION);
9774 }
9775
9776 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009778 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009779 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009780 {
9781 return gl::error(GL_OUT_OF_MEMORY);
9782 }
9783}
9784
9785void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9786{
9787 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9788 program, bufSize, length, binaryFormat, binary);
9789
9790 try
9791 {
9792 gl::Context *context = gl::getNonLostContext();
9793
9794 if (context)
9795 {
9796 if (context->getClientVersion() < 3)
9797 {
9798 return gl::error(GL_INVALID_OPERATION);
9799 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009800
Jamie Madill54133512013-06-21 09:33:07 -04009801 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009802 UNIMPLEMENTED();
9803 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009804 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009805 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009806 {
9807 return gl::error(GL_OUT_OF_MEMORY);
9808 }
9809}
9810
9811void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9812{
9813 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9814 program, binaryFormat, binary, length);
9815
9816 try
9817 {
9818 gl::Context *context = gl::getNonLostContext();
9819
9820 if (context)
9821 {
9822 if (context->getClientVersion() < 3)
9823 {
9824 return gl::error(GL_INVALID_OPERATION);
9825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009826
Jamie Madill54133512013-06-21 09:33:07 -04009827 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009828 UNIMPLEMENTED();
9829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009830 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009831 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009832 {
9833 return gl::error(GL_OUT_OF_MEMORY);
9834 }
9835}
9836
9837void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9838{
9839 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9840 program, pname, value);
9841
9842 try
9843 {
9844 gl::Context *context = gl::getNonLostContext();
9845
9846 if (context)
9847 {
9848 if (context->getClientVersion() < 3)
9849 {
9850 return gl::error(GL_INVALID_OPERATION);
9851 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009852
Jamie Madill54133512013-06-21 09:33:07 -04009853 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009854 UNIMPLEMENTED();
9855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009856 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009857 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009858 {
9859 return gl::error(GL_OUT_OF_MEMORY);
9860 }
9861}
9862
9863void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9864{
9865 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9866 target, numAttachments, attachments);
9867
9868 try
9869 {
9870 gl::Context *context = gl::getNonLostContext();
9871
9872 if (context)
9873 {
9874 if (context->getClientVersion() < 3)
9875 {
9876 return gl::error(GL_INVALID_OPERATION);
9877 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009878
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009879 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009880 {
9881 return;
9882 }
9883
9884 int maxDimension = context->getMaximumRenderbufferDimension();
9885 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009887 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009888 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009889 {
9890 return gl::error(GL_OUT_OF_MEMORY);
9891 }
9892}
9893
9894void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9895{
9896 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9897 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9898 target, numAttachments, attachments, x, y, width, height);
9899
9900 try
9901 {
9902 gl::Context *context = gl::getNonLostContext();
9903
9904 if (context)
9905 {
9906 if (context->getClientVersion() < 3)
9907 {
9908 return gl::error(GL_INVALID_OPERATION);
9909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009910
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009911 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009912 {
9913 return;
9914 }
9915
9916 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009918 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009919 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009920 {
9921 return gl::error(GL_OUT_OF_MEMORY);
9922 }
9923}
9924
9925void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9926{
9927 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9928 target, levels, internalformat, width, height);
9929
9930 try
9931 {
9932 gl::Context *context = gl::getNonLostContext();
9933
9934 if (context)
9935 {
9936 if (context->getClientVersion() < 3)
9937 {
9938 return gl::error(GL_INVALID_OPERATION);
9939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009940
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009941 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009942 {
9943 return;
9944 }
9945
9946 switch (target)
9947 {
9948 case GL_TEXTURE_2D:
9949 {
9950 gl::Texture2D *texture2d = context->getTexture2D();
9951 texture2d->storage(levels, internalformat, width, height);
9952 }
9953 break;
9954
Geoff Lang01c21d22013-09-24 11:52:16 -04009955 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009956 {
9957 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9958 textureCube->storage(levels, internalformat, width);
9959 }
9960 break;
9961
9962 default:
9963 return gl::error(GL_INVALID_ENUM);
9964 }
9965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009966 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009967 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009968 {
9969 return gl::error(GL_OUT_OF_MEMORY);
9970 }
9971}
9972
9973void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9974{
9975 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9976 "GLsizei height = %d, GLsizei depth = %d)",
9977 target, levels, internalformat, width, height, depth);
9978
9979 try
9980 {
9981 gl::Context *context = gl::getNonLostContext();
9982
9983 if (context)
9984 {
9985 if (context->getClientVersion() < 3)
9986 {
9987 return gl::error(GL_INVALID_OPERATION);
9988 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009989
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009990 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009991 {
9992 return;
9993 }
9994
9995 switch (target)
9996 {
9997 case GL_TEXTURE_3D:
9998 {
9999 gl::Texture3D *texture3d = context->getTexture3D();
10000 texture3d->storage(levels, internalformat, width, height, depth);
10001 }
10002 break;
10003
10004 case GL_TEXTURE_2D_ARRAY:
10005 {
10006 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
10007 texture2darray->storage(levels, internalformat, width, height, depth);
10008 }
10009 break;
10010
10011 default:
Geoff Lang01c21d22013-09-24 11:52:16 -040010012 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000010013 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010014 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010015 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010016 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010017 {
10018 return gl::error(GL_OUT_OF_MEMORY);
10019 }
10020}
10021
10022void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10023{
10024 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10025 "GLint* params = 0x%0.8p)",
10026 target, internalformat, pname, bufSize, params);
10027
10028 try
10029 {
10030 gl::Context *context = gl::getNonLostContext();
10031
10032 if (context)
10033 {
10034 if (context->getClientVersion() < 3)
10035 {
10036 return gl::error(GL_INVALID_OPERATION);
10037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010038
Shannon Woods809d2502013-07-08 10:32:18 -040010039 if (!gl::IsColorRenderingSupported(internalformat, context) &&
10040 !gl::IsDepthRenderingSupported(internalformat, context) &&
10041 !gl::IsStencilRenderingSupported(internalformat, context))
10042 {
10043 return gl::error(GL_INVALID_ENUM);
10044 }
10045
10046 if (target != GL_RENDERBUFFER)
10047 {
10048 return gl::error(GL_INVALID_ENUM);
10049 }
10050
10051 if (bufSize < 0)
10052 {
10053 return gl::error(GL_INVALID_VALUE);
10054 }
10055
10056 switch (pname)
10057 {
10058 case GL_NUM_SAMPLE_COUNTS:
10059 if (bufSize != 0)
10060 *params = context->getNumSampleCounts(internalformat);
10061 break;
10062 case GL_SAMPLES:
10063 context->getSampleCounts(internalformat, bufSize, params);
10064 break;
10065 default:
10066 return gl::error(GL_INVALID_ENUM);
10067 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +000010068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010069 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010070 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010071 {
10072 return gl::error(GL_OUT_OF_MEMORY);
10073 }
10074}
10075
10076// Extension functions
10077
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010078void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10079 GLbitfield mask, GLenum filter)
10080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010081 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010082 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10083 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10084 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10085
10086 try
10087 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010089
10090 if (context)
10091 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -040010092 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -040010093 dstX0, dstY0, dstX1, dstY1, mask, filter,
10094 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010095 {
Geoff Lang758d5b22013-06-11 11:42:50 -040010096 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010097 }
10098
Geoff Lang758d5b22013-06-11 11:42:50 -040010099 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
10100 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010101 }
10102 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010103 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010105 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010106 }
10107}
10108
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010109void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10110 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010112 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010113 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010114 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010115 target, level, internalformat, width, height, depth, border, format, type, pixels);
10116
10117 try
10118 {
10119 UNIMPLEMENTED(); // FIXME
10120 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010121 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010123 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010124 }
10125}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010126
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010127void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10128 GLenum *binaryFormat, void *binary)
10129{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010130 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 +000010131 program, bufSize, length, binaryFormat, binary);
10132
10133 try
10134 {
10135 gl::Context *context = gl::getNonLostContext();
10136
10137 if (context)
10138 {
10139 gl::Program *programObject = context->getProgram(program);
10140
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010141 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010143 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010144 }
10145
10146 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10147
10148 if (!programBinary)
10149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010150 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010151 }
10152
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010153 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010155 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010156 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010157
10158 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010159 }
10160 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010161 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010163 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010164 }
10165}
10166
10167void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10168 const void *binary, GLint length)
10169{
10170 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10171 program, binaryFormat, binary, length);
10172
10173 try
10174 {
10175 gl::Context *context = gl::getNonLostContext();
10176
10177 if (context)
10178 {
10179 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010181 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010182 }
10183
10184 gl::Program *programObject = context->getProgram(program);
10185
10186 if (!programObject)
10187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010188 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010189 }
10190
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010191 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010192 }
10193 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010194 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010196 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010197 }
10198}
10199
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010200void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10201{
10202 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10203
10204 try
10205 {
10206 gl::Context *context = gl::getNonLostContext();
10207
10208 if (context)
10209 {
10210 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10211 {
10212 return gl::error(GL_INVALID_VALUE);
10213 }
10214
10215 if (context->getDrawFramebufferHandle() == 0)
10216 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010217 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010218 {
10219 return gl::error(GL_INVALID_OPERATION);
10220 }
10221
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010222 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010223 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010224 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010225 }
10226 }
10227 else
10228 {
10229 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10230 {
10231 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10232 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10233 {
10234 return gl::error(GL_INVALID_OPERATION);
10235 }
10236 }
10237 }
10238
10239 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10240
10241 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10242 {
10243 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10244 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010245
10246 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10247 {
10248 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10249 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010250 }
10251 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010252 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010253 {
10254 return gl::error(GL_OUT_OF_MEMORY);
10255 }
10256}
10257
Shannon Woodsb3801742014-03-27 14:59:19 -040010258void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
10259{
10260 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
10261
10262 try
10263 {
10264 gl::Context *context = gl::getNonLostContext();
10265
10266 if (context)
10267 {
10268 if (!context->supportsPBOs())
10269 {
10270 return gl::error(GL_INVALID_OPERATION);
10271 }
10272
10273 if (!gl::ValidBufferTarget(context, target))
10274 {
10275 return gl::error(GL_INVALID_ENUM);
10276 }
10277
10278 if (pname != GL_BUFFER_MAP_POINTER)
10279 {
10280 return gl::error(GL_INVALID_ENUM);
10281 }
10282
10283 gl::Buffer *buffer = context->getTargetBuffer(target);
10284
10285 if (!buffer || !buffer->mapped())
10286 {
10287 *params = NULL;
10288 }
10289
10290 *params = buffer->mapPointer();
10291 }
10292 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010293 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010294 {
10295 return gl::error(GL_OUT_OF_MEMORY);
10296 }
10297}
10298
10299void * __stdcall glMapBufferOES(GLenum target, GLenum access)
10300{
10301 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
10302
10303 try
10304 {
10305 gl::Context *context = gl::getNonLostContext();
10306
10307 if (context)
10308 {
10309 if (!gl::ValidBufferTarget(context, target))
10310 {
10311 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10312 }
10313
10314 gl::Buffer *buffer = context->getTargetBuffer(target);
10315
10316 if (buffer == NULL)
10317 {
10318 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10319 }
10320
10321 if (access != GL_WRITE_ONLY_OES)
10322 {
10323 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10324 }
10325
10326 if (buffer->mapped())
10327 {
10328 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10329 }
10330
10331 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10332 }
10333 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010334 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010335 {
10336 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10337 }
10338
10339 return NULL;
10340}
10341
10342GLboolean __stdcall glUnmapBufferOES(GLenum target)
10343{
10344 EVENT("(GLenum target = 0x%X)", target);
10345
10346 try
10347 {
10348 gl::Context *context = gl::getNonLostContext();
10349
10350 if (context)
10351 {
10352 if (!gl::ValidBufferTarget(context, target))
10353 {
10354 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10355 }
10356
10357 gl::Buffer *buffer = context->getTargetBuffer(target);
10358
10359 if (buffer == NULL || !buffer->mapped())
10360 {
10361 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10362 }
10363
10364 // TODO: detect if we had corruption. if so, throw an error and return false.
10365
10366 buffer->unmap();
10367
10368 return GL_TRUE;
10369 }
10370 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010371 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010372 {
10373 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10374 }
10375
10376 return GL_FALSE;
10377}
10378
Shannon Woods916e7692014-03-27 16:58:22 -040010379void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10380{
10381 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10382 target, offset, length, access);
10383
10384 try
10385 {
10386 gl::Context *context = gl::getNonLostContext();
10387
10388 if (context)
10389 {
10390 if (!gl::ValidBufferTarget(context, target))
10391 {
10392 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10393 }
10394
10395 if (offset < 0 || length < 0)
10396 {
10397 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10398 }
10399
10400 gl::Buffer *buffer = context->getTargetBuffer(target);
10401
10402 if (buffer == NULL)
10403 {
10404 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10405 }
10406
10407 // Check for buffer overflow
10408 size_t offsetSize = static_cast<size_t>(offset);
10409 size_t lengthSize = static_cast<size_t>(length);
10410
10411 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10412 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10413 {
10414 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10415 }
10416
10417 // Check for invalid bits in the mask
10418 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10419 GL_MAP_WRITE_BIT |
10420 GL_MAP_INVALIDATE_RANGE_BIT |
10421 GL_MAP_INVALIDATE_BUFFER_BIT |
10422 GL_MAP_FLUSH_EXPLICIT_BIT |
10423 GL_MAP_UNSYNCHRONIZED_BIT;
10424
10425 if (access & ~(allAccessBits))
10426 {
10427 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10428 }
10429
10430 if (length == 0 || buffer->mapped())
10431 {
10432 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10433 }
10434
10435 // Check for invalid bit combinations
10436 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10437 {
10438 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10439 }
10440
10441 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10442 GL_MAP_INVALIDATE_BUFFER_BIT |
10443 GL_MAP_UNSYNCHRONIZED_BIT;
10444
10445 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10446 {
10447 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10448 }
10449
10450 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10451 {
10452 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10453 }
10454
10455 return buffer->mapRange(offset, length, access);
10456 }
10457 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010458 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010459 {
10460 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10461 }
10462
10463 return NULL;
10464}
10465
10466void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10467{
10468 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10469
10470 try
10471 {
10472 gl::Context *context = gl::getNonLostContext();
10473
10474 if (context)
10475 {
10476 if (offset < 0 || length < 0)
10477 {
10478 return gl::error(GL_INVALID_VALUE);
10479 }
10480
10481 if (!gl::ValidBufferTarget(context, target))
10482 {
10483 return gl::error(GL_INVALID_ENUM);
10484 }
10485
10486 gl::Buffer *buffer = context->getTargetBuffer(target);
10487
10488 if (buffer == NULL)
10489 {
10490 return gl::error(GL_INVALID_OPERATION);
10491 }
10492
10493 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10494 {
10495 return gl::error(GL_INVALID_OPERATION);
10496 }
10497
10498 // Check for buffer overflow
10499 size_t offsetSize = static_cast<size_t>(offset);
10500 size_t lengthSize = static_cast<size_t>(length);
10501
10502 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10503 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10504 {
10505 return gl::error(GL_INVALID_VALUE);
10506 }
10507
10508 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10509 }
10510 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010511 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010512 {
10513 return gl::error(GL_OUT_OF_MEMORY);
10514 }
10515}
10516
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010517__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10518{
10519 struct Extension
10520 {
10521 const char *name;
10522 __eglMustCastToProperFunctionPointerType address;
10523 };
10524
10525 static const Extension glExtensions[] =
10526 {
10527 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010528 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010529 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010530 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10531 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10532 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10533 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10534 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10535 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10536 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010537 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010538 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010539 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10540 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10541 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10542 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010543 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10544 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10545 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10546 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10547 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10548 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10549 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010550 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010551 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10552 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10553 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010554 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010555 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10556 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10557 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010558 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10559 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10560 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010561
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010562 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010563 {
10564 if (strcmp(procname, glExtensions[ext].name) == 0)
10565 {
10566 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10567 }
10568 }
10569
10570 return NULL;
10571}
10572
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010573// Non-public functions used by EGL
10574
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010575bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010576{
10577 EVENT("(egl::Surface* surface = 0x%0.8p)",
10578 surface);
10579
10580 try
10581 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010582 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010583
10584 if (context)
10585 {
10586 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010587 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010588
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010589 if (textureObject->isImmutable())
10590 {
10591 return false;
10592 }
10593
Geoff Lang32d508e2014-02-11 09:39:48 -050010594 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010595 }
10596 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010597 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010599 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010600 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010601
10602 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010603}
10604
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010605}