blob: d2d14c1e435830e494d1c1a0661de7afe0e1550d [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,
Jamie Madill6f38f822014-06-06 17:12:20 -0400847 0, 0, width, height, border, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000848 {
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 Madill6f38f822014-06-06 17:12:20 -0400854 0, 0, 0, width, height, 1, border, 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 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001580 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581
1582 if (context)
1583 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001584 if (!ValidateDrawArrays(context, mode, first, count))
Geoff Langeeba6e12014-02-03 13:12:30 -05001585 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001586 return;
Geoff Langeeba6e12014-02-03 13:12:30 -05001587 }
1588
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001589 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001590 }
1591 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001592 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001595 }
1596}
1597
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001598void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1599{
1600 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1601
1602 try
1603 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001605
Jamie Madill250d33f2014-06-06 17:09:03 -04001606 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001607 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001608 if (!ValidateDrawArraysInstanced(context, mode, first, count, primcount))
Jamie Madill7a5f7382014-03-05 15:01:24 -05001609 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001610 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001611 }
1612
Jamie Madill250d33f2014-06-06 17:09:03 -04001613 context->drawArrays(mode, first, count, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001614 }
1615 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001616 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001618 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001619 }
1620}
1621
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001622void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001624 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 +00001625 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001626
1627 try
1628 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001630
1631 if (context)
1632 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001633 if (!ValidateDrawElements(context, mode, count, type, indices))
daniel@transgaming.com83921382011-01-08 05:46:00 +00001634 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001635 return;
Jamie Madill7a5f7382014-03-05 15:01:24 -05001636 }
1637
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001638 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001639 }
1640 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001641 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001644 }
1645}
1646
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001647void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1648{
1649 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1650 mode, count, type, indices, primcount);
1651
1652 try
1653 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001654 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001655
Jamie Madill250d33f2014-06-06 17:09:03 -04001656 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001657 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001658 if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, primcount))
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001659 {
Jamie Madill250d33f2014-06-06 17:09:03 -04001660 return;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001661 }
Jamie Madill250d33f2014-06-06 17:09:03 -04001662
1663 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001664 }
1665 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001666 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001669 }
1670}
1671
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001672void __stdcall glEnable(GLenum cap)
1673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001674 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675
1676 try
1677 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679
1680 if (context)
1681 {
Geoff Lang0550d032014-01-30 11:29:07 -05001682 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001685 }
Geoff Lang0550d032014-01-30 11:29:07 -05001686
1687 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 }
1689 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001690 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693 }
1694}
1695
1696void __stdcall glEnableVertexAttribArray(GLuint index)
1697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001698 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001699
1700 try
1701 {
1702 if (index >= gl::MAX_VERTEX_ATTRIBS)
1703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001705 }
1706
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708
1709 if (context)
1710 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001711 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001712 }
1713 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001714 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 }
1718}
1719
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001720void __stdcall glEndQueryEXT(GLenum target)
1721{
1722 EVENT("GLenum target = 0x%X)", target);
1723
1724 try
1725 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001726 gl::Context *context = gl::getNonLostContext();
1727
1728 if (context)
1729 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001730 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001731 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001732 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001733 }
1734
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001735 context->endQuery(target);
1736 }
1737 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001738 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001740 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001741 }
1742}
1743
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001744void __stdcall glFinishFenceNV(GLuint fence)
1745{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001746 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001747
1748 try
1749 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001750 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001751
1752 if (context)
1753 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001754 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001755
1756 if (fenceObject == NULL)
1757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001758 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001759 }
1760
Jamie Madillfb9a7402013-07-26 11:55:01 -04001761 if (fenceObject->isFence() != GL_TRUE)
1762 {
1763 return gl::error(GL_INVALID_OPERATION);
1764 }
1765
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001766 fenceObject->finishFence();
1767 }
1768 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001769 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001771 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001772 }
1773}
1774
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775void __stdcall glFinish(void)
1776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001777 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778
1779 try
1780 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001781 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001782
1783 if (context)
1784 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001785 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001786 }
1787 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001788 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001790 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791 }
1792}
1793
1794void __stdcall glFlush(void)
1795{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001796 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001797
1798 try
1799 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801
1802 if (context)
1803 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001804 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001805 }
1806 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001807 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001809 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810 }
1811}
1812
1813void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001815 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001816 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001817
1818 try
1819 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001820 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001822 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001823 }
1824
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001826
1827 if (context)
1828 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001829 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001830 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001831 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001832 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001833
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001834 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1835 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001837 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001839 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001840 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001841 }
1842 else
1843 {
1844 switch (attachment)
1845 {
1846 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001847 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001848 break;
1849 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001850 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001851 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001852 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001853 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1854 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001855 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001856 UNREACHABLE();
1857 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001858 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001859 }
1860 }
1861 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001862 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001864 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865 }
1866}
1867
1868void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001870 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001871 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872
1873 try
1874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876 if (context)
1877 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001878 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001879 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001880 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001881 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001882 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001883
1884 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001885 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001886 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001887 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001888 }
1889
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001890 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001891 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001892 textarget = GL_NONE;
1893 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001894
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001895 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001897 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001898 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001899 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001900 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001901 }
1902 else
1903 {
1904 switch (attachment)
1905 {
Geoff Lang309c92a2013-07-25 16:23:19 -04001906 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
1907 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
1908 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001909 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001910 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001911 }
1912 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001913 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001915 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001916 }
1917}
1918
1919void __stdcall glFrontFace(GLenum mode)
1920{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001921 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922
1923 try
1924 {
1925 switch (mode)
1926 {
1927 case GL_CW:
1928 case GL_CCW:
1929 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931
1932 if (context)
1933 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001934 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001935 }
1936 }
1937 break;
1938 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001939 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940 }
1941 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001942 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001944 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001945 }
1946}
1947
1948void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1949{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001950 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001951
1952 try
1953 {
1954 if (n < 0)
1955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001956 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957 }
1958
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960
1961 if (context)
1962 {
1963 for (int i = 0; i < n; i++)
1964 {
1965 buffers[i] = context->createBuffer();
1966 }
1967 }
1968 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001969 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001971 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 }
1973}
1974
1975void __stdcall glGenerateMipmap(GLenum target)
1976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001977 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001978
1979 try
1980 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001981 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001982
1983 if (context)
1984 {
Jamie Madill35d15012013-10-07 10:46:37 -04001985 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001987 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001988 }
Geoff Langae4852a2013-06-05 15:00:34 -04001989
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001990 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04001991
1992 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04001993 {
1994 return gl::error(GL_INVALID_OPERATION);
1995 }
1996
Geoff Lang005df412013-10-16 14:12:50 -04001997 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04001998
Geoff Langae4852a2013-06-05 15:00:34 -04001999 // Internally, all texture formats are sized so checking if the format
2000 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002001
Geoff Langcec35902014-04-16 10:52:36 -04002002 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalFormat);
2003
2004 bool validRenderable = (formatCaps.colorRendering ||
Jamie Madill61b54432014-02-18 15:27:19 -05002005 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2006
Geoff Langcec35902014-04-16 10:52:36 -04002007 if (formatCaps.depthRendering || gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
2008 !formatCaps.filtering || !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002009 {
2010 return gl::error(GL_INVALID_OPERATION);
2011 }
2012
Jamie Madillc1f8b162013-10-07 10:46:38 -04002013 // Non-power of 2 ES2 check
Geoff Langcec35902014-04-16 10:52:36 -04002014 if (!context->getCaps().extensions.textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
Jamie Madillc1f8b162013-10-07 10:46:38 -04002015 {
2016 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2017 return gl::error(GL_INVALID_OPERATION);
2018 }
2019
2020 // Cube completeness check
2021 if (target == GL_TEXTURE_CUBE_MAP)
2022 {
2023 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2024 if (!textureCube->isCubeComplete())
2025 {
2026 return gl::error(GL_INVALID_OPERATION);
2027 }
2028 }
2029
Geoff Langae4852a2013-06-05 15:00:34 -04002030 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002031 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002033 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002035 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037}
2038
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002039void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2040{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002041 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002042
2043 try
2044 {
2045 if (n < 0)
2046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002047 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002048 }
2049
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002050 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002051
2052 if (context)
2053 {
2054 for (int i = 0; i < n; i++)
2055 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002056 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002057 }
2058 }
2059 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002060 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002062 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002063 }
2064}
2065
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2067{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002068 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002069
2070 try
2071 {
2072 if (n < 0)
2073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002074 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002075 }
2076
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078
2079 if (context)
2080 {
2081 for (int i = 0; i < n; i++)
2082 {
2083 framebuffers[i] = context->createFramebuffer();
2084 }
2085 }
2086 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002087 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002089 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002090 }
2091}
2092
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002093void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2094{
2095 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2096
2097 try
2098 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002099 gl::Context *context = gl::getNonLostContext();
2100
2101 if (context)
2102 {
Geoff Lang37dde692014-01-31 16:34:54 -05002103 if (n < 0)
2104 {
2105 return gl::error(GL_INVALID_VALUE);
2106 }
2107
2108 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002109 {
2110 ids[i] = context->createQuery();
2111 }
2112 }
2113 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002114 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002116 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002117 }
2118}
2119
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002120void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2121{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002122 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002123
2124 try
2125 {
2126 if (n < 0)
2127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002128 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129 }
2130
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002131 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132
2133 if (context)
2134 {
2135 for (int i = 0; i < n; i++)
2136 {
2137 renderbuffers[i] = context->createRenderbuffer();
2138 }
2139 }
2140 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002141 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002144 }
2145}
2146
2147void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2148{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002149 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002150
2151 try
2152 {
2153 if (n < 0)
2154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002155 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002156 }
2157
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159
2160 if (context)
2161 {
2162 for (int i = 0; i < n; i++)
2163 {
2164 textures[i] = context->createTexture();
2165 }
2166 }
2167 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002168 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172}
2173
daniel@transgaming.com85423182010-04-22 13:35:27 +00002174void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002176 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002177 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002178 program, index, bufsize, length, size, type, name);
2179
2180 try
2181 {
2182 if (bufsize < 0)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002188
2189 if (context)
2190 {
2191 gl::Program *programObject = context->getProgram(program);
2192
2193 if (!programObject)
2194 {
2195 if (context->getShader(program))
2196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002197 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002198 }
2199 else
2200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002201 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002202 }
2203 }
2204
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002205 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002207 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002208 }
2209
2210 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2211 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002212 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002213 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002215 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216 }
2217}
2218
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002219void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002221 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002222 "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 +00002223 program, index, bufsize, length, size, type, name);
2224
2225 try
2226 {
2227 if (bufsize < 0)
2228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002229 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 }
2231
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002232 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002233
2234 if (context)
2235 {
2236 gl::Program *programObject = context->getProgram(program);
2237
2238 if (!programObject)
2239 {
2240 if (context->getShader(program))
2241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002242 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002243 }
2244 else
2245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002246 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002247 }
2248 }
2249
2250 if (index >= (GLuint)programObject->getActiveUniformCount())
2251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002252 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002253 }
2254
2255 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2256 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002257 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002258 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002261 }
2262}
2263
2264void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2265{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002266 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 +00002267 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002268
2269 try
2270 {
2271 if (maxcount < 0)
2272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 }
2275
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002276 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002277
2278 if (context)
2279 {
2280 gl::Program *programObject = context->getProgram(program);
2281
2282 if (!programObject)
2283 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002284 if (context->getShader(program))
2285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002286 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002287 }
2288 else
2289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002291 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002292 }
2293
2294 return programObject->getAttachedShaders(maxcount, count, shaders);
2295 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002296 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002297 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002299 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002300 }
2301}
2302
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002303int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002304{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002305 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002306
2307 try
2308 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002309 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310
2311 if (context)
2312 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002313
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002314 gl::Program *programObject = context->getProgram(program);
2315
2316 if (!programObject)
2317 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002318 if (context->getShader(program))
2319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002320 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002321 }
2322 else
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002325 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 }
2327
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002328 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002329 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002331 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002332 }
2333
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002334 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335 }
2336 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002337 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002339 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340 }
2341
2342 return -1;
2343}
2344
2345void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2346{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002347 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348
2349 try
2350 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002352
2353 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002355 GLenum nativeType;
2356 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002357 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2358 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002359 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002360 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002361
2362 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002363 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002364 context->getBooleanv(pname, params);
2365 }
Jamie Madill55856b12014-01-02 13:59:50 -05002366 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002367 {
Jamie Madill55856b12014-01-02 13:59:50 -05002368 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002369 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
2371 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002372 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002374 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 }
2376}
2377
2378void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002380 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 +00002381
2382 try
2383 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002385
2386 if (context)
2387 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002388 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002389 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002390 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002391 }
2392
Jamie Madill70656a62014-03-05 15:01:26 -05002393 if (!gl::ValidBufferParameter(context, pname))
2394 {
2395 return gl::error(GL_INVALID_ENUM);
2396 }
2397
Jamie Madill8c96d582014-03-05 15:01:23 -05002398 gl::Buffer *buffer = context->getTargetBuffer(target);
2399
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002400 if (!buffer)
2401 {
2402 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002403 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002404 }
2405
2406 switch (pname)
2407 {
2408 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002409 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002410 break;
2411 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002412 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002413 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002414 case GL_BUFFER_ACCESS_FLAGS:
2415 *params = buffer->accessFlags();
2416 break;
2417 case GL_BUFFER_MAPPED:
2418 *params = static_cast<GLint>(buffer->mapped());
2419 break;
2420 case GL_BUFFER_MAP_OFFSET:
2421 *params = gl::clampCast<GLint>(buffer->mapOffset());
2422 break;
2423 case GL_BUFFER_MAP_LENGTH:
2424 *params = gl::clampCast<GLint>(buffer->mapLength());
2425 break;
2426 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002427 }
2428 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002429 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002430 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433 }
2434}
2435
2436GLenum __stdcall glGetError(void)
2437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002438 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439
2440 gl::Context *context = gl::getContext();
2441
2442 if (context)
2443 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002444 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445 }
2446
2447 return GL_NO_ERROR;
2448}
2449
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002450void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2451{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002452 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002453
2454 try
2455 {
2456
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002457 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002458
2459 if (context)
2460 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002461 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002462
2463 if (fenceObject == NULL)
2464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002465 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002466 }
2467
Jamie Madillfb9a7402013-07-26 11:55:01 -04002468 if (fenceObject->isFence() != GL_TRUE)
2469 {
2470 return gl::error(GL_INVALID_OPERATION);
2471 }
2472
2473 switch (pname)
2474 {
2475 case GL_FENCE_STATUS_NV:
2476 case GL_FENCE_CONDITION_NV:
2477 break;
2478
2479 default: return gl::error(GL_INVALID_ENUM);
2480 }
2481
2482 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002483 }
2484 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002485 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002487 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002488 }
2489}
2490
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002491void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002493 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002494
2495 try
2496 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002497 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002498
2499 if (context)
2500 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002501 GLenum nativeType;
2502 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002503 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2504 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002505 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002506 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002507
2508 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002509 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002510 context->getFloatv(pname, params);
2511 }
Jamie Madill55856b12014-01-02 13:59:50 -05002512 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002513 {
Jamie Madill55856b12014-01-02 13:59:50 -05002514 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002515 }
2516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002518 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521 }
2522}
2523
2524void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002526 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 +00002527 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002528
2529 try
2530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002532
2533 if (context)
2534 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002535 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002538 }
2539
Jamie Madill1e3fa742014-06-16 10:34:00 -04002540 int clientVersion = context->getClientVersion();
2541
Geoff Lang646559f2013-08-15 11:08:15 -04002542 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002543 {
Geoff Lang646559f2013-08-15 11:08:15 -04002544 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2545 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2546 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2547 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2548 break;
2549 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2550 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2551 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2552 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2553 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2554 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2555 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2556 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2557 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002558 if (clientVersion >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002559 {
Geoff Lang646559f2013-08-15 11:08:15 -04002560 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002561 }
Geoff Lang646559f2013-08-15 11:08:15 -04002562 default:
2563 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002564 }
Geoff Lang646559f2013-08-15 11:08:15 -04002565
2566 // Determine if the attachment is a valid enum
2567 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002568 {
Geoff Lang646559f2013-08-15 11:08:15 -04002569 case GL_BACK:
2570 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002571 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002572 case GL_STENCIL:
2573 case GL_DEPTH_STENCIL_ATTACHMENT:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002574 if (clientVersion < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002575 {
Geoff Lang646559f2013-08-15 11:08:15 -04002576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002577 }
Geoff Lang646559f2013-08-15 11:08:15 -04002578 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002579
Geoff Lang646559f2013-08-15 11:08:15 -04002580 case GL_DEPTH_ATTACHMENT:
2581 case GL_STENCIL_ATTACHMENT:
2582 break;
2583
2584 default:
2585 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2586 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2587 {
2588 return gl::error(GL_INVALID_ENUM);
2589 }
2590 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002591 }
2592
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002593 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2594 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002595 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2596
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002597 GLenum attachmentType;
2598 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002599 GLuint attachmentLevel;
2600 GLuint attachmentLayer;
Jamie Madill3c7fa222014-06-05 13:08:51 -04002601 gl::FramebufferAttachment *attachmentObject;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002602
Jamie Madill3c7fa222014-06-05 13:08:51 -04002603 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002604 {
Jamie Madill1e3fa742014-06-16 10:34:00 -04002605 if (clientVersion < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002606 {
Geoff Lang646559f2013-08-15 11:08:15 -04002607 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002608 }
2609
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002610 switch (attachment)
2611 {
Geoff Lang646559f2013-08-15 11:08:15 -04002612 case GL_BACK:
2613 attachmentType = framebuffer->getColorbufferType(0);
2614 attachmentHandle = framebuffer->getColorbufferHandle(0);
2615 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2616 attachmentLayer = framebuffer->getColorbufferLayer(0);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002617 attachmentObject = framebuffer->getColorbuffer(0);
Geoff Lang646559f2013-08-15 11:08:15 -04002618 break;
2619 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002620 attachmentType = framebuffer->getDepthbufferType();
2621 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002622 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2623 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002624 attachmentObject = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002625 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002626 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002627 attachmentType = framebuffer->getStencilbufferType();
2628 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002629 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2630 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002631 attachmentObject = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002632 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002633 default:
2634 return gl::error(GL_INVALID_OPERATION);
2635 }
2636 }
2637 else
2638 {
2639 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2640 {
2641 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2642 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2643 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2644 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2645 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002646 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
Geoff Lang646559f2013-08-15 11:08:15 -04002647 }
2648 else
2649 {
2650 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002651 {
Geoff Lang646559f2013-08-15 11:08:15 -04002652 case GL_DEPTH_ATTACHMENT:
2653 attachmentType = framebuffer->getDepthbufferType();
2654 attachmentHandle = framebuffer->getDepthbufferHandle();
2655 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2656 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002657 attachmentObject = framebuffer->getDepthbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002658 break;
2659 case GL_STENCIL_ATTACHMENT:
2660 attachmentType = framebuffer->getStencilbufferType();
2661 attachmentHandle = framebuffer->getStencilbufferHandle();
2662 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2663 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002664 attachmentObject = framebuffer->getStencilbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002665 break;
2666 case GL_DEPTH_STENCIL_ATTACHMENT:
2667 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2668 {
2669 return gl::error(GL_INVALID_OPERATION);
2670 }
2671 attachmentType = framebuffer->getDepthStencilbufferType();
2672 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2673 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2674 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002675 attachmentObject = framebuffer->getDepthStencilBuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002676 break;
2677 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002678 return gl::error(GL_INVALID_OPERATION);
2679 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002680 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002681 }
2682
2683 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002684 if (framebufferHandle == 0)
2685 {
2686 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2687 }
2688 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002689 {
2690 attachmentObjectType = attachmentType;
2691 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002692 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002693 {
2694 attachmentObjectType = GL_TEXTURE;
2695 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002696 else
2697 {
2698 UNREACHABLE();
2699 return;
2700 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701
Geoff Lang646559f2013-08-15 11:08:15 -04002702 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002703 {
Geoff Lang646559f2013-08-15 11:08:15 -04002704 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2705 // is NONE, then querying any other pname will generate INVALID_ENUM.
2706
2707 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2708 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2709 // INVALID_OPERATION for all other pnames
2710
2711 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002712 {
Geoff Lang646559f2013-08-15 11:08:15 -04002713 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2714 *params = attachmentObjectType;
2715 break;
2716
2717 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002718 if (clientVersion < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002719 {
Geoff Lang646559f2013-08-15 11:08:15 -04002720 return gl::error(GL_INVALID_ENUM);
2721 }
2722 *params = 0;
2723 break;
2724
2725 default:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002726 if (clientVersion < 3)
Geoff Lang646559f2013-08-15 11:08:15 -04002727 {
2728 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002729 }
2730 else
2731 {
Geoff Lang646559f2013-08-15 11:08:15 -04002732 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002733 }
2734 }
Geoff Lang646559f2013-08-15 11:08:15 -04002735 }
2736 else
2737 {
2738 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2739 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002740 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002741
2742 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002743 {
Geoff Lang646559f2013-08-15 11:08:15 -04002744 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2745 *params = attachmentObjectType;
2746 break;
2747
2748 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2749 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2750 {
2751 return gl::error(GL_INVALID_ENUM);
2752 }
2753 *params = attachmentHandle;
2754 break;
2755
2756 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2757 if (attachmentObjectType != GL_TEXTURE)
2758 {
2759 return gl::error(GL_INVALID_ENUM);
2760 }
2761 *params = attachmentLevel;
2762 break;
2763
2764 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2765 if (attachmentObjectType != GL_TEXTURE)
2766 {
2767 return gl::error(GL_INVALID_ENUM);
2768 }
2769 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2770 break;
2771
2772 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002773 *params = attachmentObject->getRedSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002774 break;
2775
2776 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002777 *params = attachmentObject->getGreenSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002778 break;
2779
2780 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002781 *params = attachmentObject->getBlueSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002782 break;
2783
2784 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002785 *params = attachmentObject->getAlphaSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002786 break;
2787
2788 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002789 *params = attachmentObject->getDepthSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002790 break;
2791
2792 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002793 *params = attachmentObject->getStencilSize(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002794 break;
2795
2796 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2797 if (attachment == GL_DEPTH_STENCIL)
2798 {
2799 gl::error(GL_INVALID_OPERATION);
2800 }
Jamie Madill1e3fa742014-06-16 10:34:00 -04002801 *params = attachmentObject->getComponentType(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002802 break;
2803
2804 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Jamie Madill1e3fa742014-06-16 10:34:00 -04002805 *params = attachmentObject->getColorEncoding(clientVersion);
Geoff Lang646559f2013-08-15 11:08:15 -04002806 break;
2807
2808 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2809 if (attachmentObjectType != GL_TEXTURE)
2810 {
2811 return gl::error(GL_INVALID_ENUM);
2812 }
2813 *params = attachmentLayer;
2814 break;
2815
2816 default:
2817 UNREACHABLE();
2818 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002819 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 }
2822 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002823 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002825 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002826 }
2827}
2828
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002829GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2830{
2831 EVENT("()");
2832
2833 try
2834 {
2835 gl::Context *context = gl::getContext();
2836
2837 if (context)
2838 {
2839 return context->getResetStatus();
2840 }
2841
2842 return GL_NO_ERROR;
2843 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002844 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002845 {
2846 return GL_OUT_OF_MEMORY;
2847 }
2848}
2849
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002850void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002852 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002853
2854 try
2855 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857
2858 if (context)
2859 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002860 GLenum nativeType;
2861 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002862
Jamie Madill893ab082014-05-16 16:56:10 -04002863 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2864 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002865 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002866 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002867
2868 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002869 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002870 context->getIntegerv(pname, params);
2871 }
Jamie Madill55856b12014-01-02 13:59:50 -05002872 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002873 {
Jamie Madill55856b12014-01-02 13:59:50 -05002874 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002875 }
2876 }
2877 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002878 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881 }
2882}
2883
2884void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002886 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002887
2888 try
2889 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002891
2892 if (context)
2893 {
2894 gl::Program *programObject = context->getProgram(program);
2895
2896 if (!programObject)
2897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002898 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002899 }
2900
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002901 if (context->getClientVersion() < 3)
2902 {
2903 switch (pname)
2904 {
2905 case GL_ACTIVE_UNIFORM_BLOCKS:
2906 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002907 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2908 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2909 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002910 return gl::error(GL_INVALID_ENUM);
2911 }
2912 }
2913
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002914 switch (pname)
2915 {
2916 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002917 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 return;
2919 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002920 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002921 return;
2922 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002923 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924 return;
2925 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002926 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927 return;
2928 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002929 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002930 return;
2931 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002932 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933 return;
2934 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002935 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002936 return;
2937 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002938 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939 return;
2940 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002941 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002942 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002943 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00002944 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002945 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002946 case GL_ACTIVE_UNIFORM_BLOCKS:
2947 *params = programObject->getActiveUniformBlockCount();
2948 return;
2949 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2950 *params = programObject->getActiveUniformBlockMaxLength();
2951 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002952 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2953 *params = programObject->getTransformFeedbackBufferMode();
2954 break;
2955 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2956 *params = programObject->getTransformFeedbackVaryingCount();
2957 break;
2958 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2959 *params = programObject->getTransformFeedbackVaryingMaxLength();
2960 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002962 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963 }
2964 }
2965 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002966 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002968 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969 }
2970}
2971
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002972void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002974 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 +00002975 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976
2977 try
2978 {
2979 if (bufsize < 0)
2980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002981 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002982 }
2983
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002984 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002985
2986 if (context)
2987 {
2988 gl::Program *programObject = context->getProgram(program);
2989
2990 if (!programObject)
2991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002993 }
2994
2995 programObject->getInfoLog(bufsize, length, infolog);
2996 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002998 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003000 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003001 }
3002}
3003
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003004void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3005{
3006 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3007
3008 try
3009 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003010 gl::Context *context = gl::getNonLostContext();
3011
3012 if (context)
3013 {
Geoff Lang37dde692014-01-31 16:34:54 -05003014 if (!ValidQueryType(context, target))
3015 {
3016 return gl::error(GL_INVALID_ENUM);
3017 }
3018
3019 switch (pname)
3020 {
3021 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003022 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003023 break;
3024
3025 default:
3026 return gl::error(GL_INVALID_ENUM);
3027 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003028 }
3029 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003030 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003032 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003033 }
3034}
3035
3036void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3037{
3038 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3039
3040 try
3041 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003042 gl::Context *context = gl::getNonLostContext();
3043
3044 if (context)
3045 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003046 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3047
3048 if (!queryObject)
3049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003050 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003051 }
3052
Jamie Madill45c785d2014-05-13 14:09:34 -04003053 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003056 }
3057
3058 switch(pname)
3059 {
3060 case GL_QUERY_RESULT_EXT:
3061 params[0] = queryObject->getResult();
3062 break;
3063 case GL_QUERY_RESULT_AVAILABLE_EXT:
3064 params[0] = queryObject->isResultAvailable();
3065 break;
3066 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003068 }
3069 }
3070 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003071 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003074 }
3075}
3076
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003077void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003079 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 +00003080
3081 try
3082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003084
3085 if (context)
3086 {
3087 if (target != GL_RENDERBUFFER)
3088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003089 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003090 }
3091
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003092 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003094 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003095 }
3096
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003097 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003098
3099 switch (pname)
3100 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003101 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3102 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3103 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3104 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3105 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3106 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3107 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3108 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3109 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003110 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langcec35902014-04-16 10:52:36 -04003111 if (!context->getCaps().extensions.framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003113 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003114 }
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04003115 *params = renderbuffer->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003116 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003117 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003118 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003119 }
3120 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003121 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003122 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003124 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126}
3127
3128void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003130 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003131
3132 try
3133 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003134 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003135
3136 if (context)
3137 {
3138 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003139
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140 if (!shaderObject)
3141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003142 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143 }
3144
3145 switch (pname)
3146 {
3147 case GL_SHADER_TYPE:
3148 *params = shaderObject->getType();
3149 return;
3150 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003151 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003152 return;
3153 case GL_COMPILE_STATUS:
3154 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3155 return;
3156 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003157 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003158 return;
3159 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003160 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003161 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003162 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3163 *params = shaderObject->getTranslatedSourceLength();
3164 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003165 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003166 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003167 }
3168 }
3169 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003170 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003172 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173 }
3174}
3175
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003176void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003178 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 +00003179 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003180
3181 try
3182 {
3183 if (bufsize < 0)
3184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003185 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003186 }
3187
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003188 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003189
3190 if (context)
3191 {
3192 gl::Shader *shaderObject = context->getShader(shader);
3193
3194 if (!shaderObject)
3195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003196 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003197 }
3198
3199 shaderObject->getInfoLog(bufsize, length, infolog);
3200 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003201 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003202 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205 }
3206}
3207
3208void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003210 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 +00003211 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003212
3213 try
3214 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003215 switch (shadertype)
3216 {
3217 case GL_VERTEX_SHADER:
3218 case GL_FRAGMENT_SHADER:
3219 break;
3220 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003222 }
3223
3224 switch (precisiontype)
3225 {
3226 case GL_LOW_FLOAT:
3227 case GL_MEDIUM_FLOAT:
3228 case GL_HIGH_FLOAT:
3229 // Assume IEEE 754 precision
3230 range[0] = 127;
3231 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003232 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003233 break;
3234 case GL_LOW_INT:
3235 case GL_MEDIUM_INT:
3236 case GL_HIGH_INT:
3237 // Some (most) hardware only supports single-precision floating-point numbers,
3238 // which can accurately represent integers up to +/-16777216
3239 range[0] = 24;
3240 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003241 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003242 break;
3243 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003244 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003245 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003247 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003249 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250 }
3251}
3252
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003253void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003255 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 +00003256 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003257
3258 try
3259 {
3260 if (bufsize < 0)
3261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003262 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003263 }
3264
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003266
3267 if (context)
3268 {
3269 gl::Shader *shaderObject = context->getShader(shader);
3270
3271 if (!shaderObject)
3272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003274 }
3275
3276 shaderObject->getSource(bufsize, length, source);
3277 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003279 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282 }
3283}
3284
zmo@google.coma574f782011-10-03 21:45:23 +00003285void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3286{
3287 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3288 shader, bufsize, length, source);
3289
3290 try
3291 {
3292 if (bufsize < 0)
3293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003294 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003295 }
3296
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003297 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003298
3299 if (context)
3300 {
3301 gl::Shader *shaderObject = context->getShader(shader);
3302
3303 if (!shaderObject)
3304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003306 }
3307
3308 shaderObject->getTranslatedSource(bufsize, length, source);
3309 }
3310 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003311 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003313 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003314 }
3315}
3316
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003317const GLubyte* __stdcall glGetString(GLenum name)
3318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003319 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003320
3321 try
3322 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003323 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003324
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 switch (name)
3326 {
3327 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003328 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003330 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003331 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003332 if (context->getClientVersion() == 2)
3333 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003334 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003335 }
3336 else
3337 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003338 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003339 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003340 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003341 if (context->getClientVersion() == 2)
3342 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003343 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003344 }
3345 else
3346 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003347 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003348 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 case GL_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04003350 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003352 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003353 }
3354 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003355 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003357 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359}
3360
3361void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003363 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 +00003364
3365 try
3366 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003368
3369 if (context)
3370 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003371 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003372
Jamie Madillfb8a8302013-07-03 14:24:12 -04003373 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003375 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003376 }
3377
3378 switch (pname)
3379 {
3380 case GL_TEXTURE_MAG_FILTER:
3381 *params = (GLfloat)texture->getMagFilter();
3382 break;
3383 case GL_TEXTURE_MIN_FILTER:
3384 *params = (GLfloat)texture->getMinFilter();
3385 break;
3386 case GL_TEXTURE_WRAP_S:
3387 *params = (GLfloat)texture->getWrapS();
3388 break;
3389 case GL_TEXTURE_WRAP_T:
3390 *params = (GLfloat)texture->getWrapT();
3391 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003392 case GL_TEXTURE_WRAP_R:
3393 if (context->getClientVersion() < 3)
3394 {
3395 return gl::error(GL_INVALID_ENUM);
3396 }
3397 *params = (GLfloat)texture->getWrapR();
3398 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003399 case GL_TEXTURE_IMMUTABLE_FORMAT:
3400 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003401 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3402 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003403 case GL_TEXTURE_IMMUTABLE_LEVELS:
3404 if (context->getClientVersion() < 3)
3405 {
3406 return gl::error(GL_INVALID_ENUM);
3407 }
Jamie Madill51a94372013-10-24 17:49:43 -04003408 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003409 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003410 case GL_TEXTURE_USAGE_ANGLE:
3411 *params = (GLfloat)texture->getUsage();
3412 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003413 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003414 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003416 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003417 }
3418 *params = (GLfloat)texture->getMaxAnisotropy();
3419 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003420 case GL_TEXTURE_SWIZZLE_R:
3421 if (context->getClientVersion() < 3)
3422 {
3423 return gl::error(GL_INVALID_ENUM);
3424 }
3425 *params = (GLfloat)texture->getSwizzleRed();
3426 break;
3427 case GL_TEXTURE_SWIZZLE_G:
3428 if (context->getClientVersion() < 3)
3429 {
3430 return gl::error(GL_INVALID_ENUM);
3431 }
3432 *params = (GLfloat)texture->getSwizzleGreen();
3433 break;
3434 case GL_TEXTURE_SWIZZLE_B:
3435 if (context->getClientVersion() < 3)
3436 {
3437 return gl::error(GL_INVALID_ENUM);
3438 }
3439 *params = (GLfloat)texture->getSwizzleBlue();
3440 break;
3441 case GL_TEXTURE_SWIZZLE_A:
3442 if (context->getClientVersion() < 3)
3443 {
3444 return gl::error(GL_INVALID_ENUM);
3445 }
3446 *params = (GLfloat)texture->getSwizzleAlpha();
3447 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003448 case GL_TEXTURE_BASE_LEVEL:
3449 if (context->getClientVersion() < 3)
3450 {
3451 return gl::error(GL_INVALID_ENUM);
3452 }
3453 *params = (GLfloat)texture->getBaseLevel();
3454 break;
3455 case GL_TEXTURE_MAX_LEVEL:
3456 if (context->getClientVersion() < 3)
3457 {
3458 return gl::error(GL_INVALID_ENUM);
3459 }
3460 *params = (GLfloat)texture->getMaxLevel();
3461 break;
3462 case GL_TEXTURE_MIN_LOD:
3463 if (context->getClientVersion() < 3)
3464 {
3465 return gl::error(GL_INVALID_ENUM);
3466 }
3467 *params = texture->getMinLod();
3468 break;
3469 case GL_TEXTURE_MAX_LOD:
3470 if (context->getClientVersion() < 3)
3471 {
3472 return gl::error(GL_INVALID_ENUM);
3473 }
3474 *params = texture->getMaxLod();
3475 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003476 default:
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 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003480 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003481 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484 }
3485}
3486
3487void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3488{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003489 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 +00003490
3491 try
3492 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003493 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003494
3495 if (context)
3496 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003497 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003498
Jamie Madillfb8a8302013-07-03 14:24:12 -04003499 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003501 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003502 }
3503
3504 switch (pname)
3505 {
3506 case GL_TEXTURE_MAG_FILTER:
3507 *params = texture->getMagFilter();
3508 break;
3509 case GL_TEXTURE_MIN_FILTER:
3510 *params = texture->getMinFilter();
3511 break;
3512 case GL_TEXTURE_WRAP_S:
3513 *params = texture->getWrapS();
3514 break;
3515 case GL_TEXTURE_WRAP_T:
3516 *params = texture->getWrapT();
3517 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003518 case GL_TEXTURE_WRAP_R:
3519 if (context->getClientVersion() < 3)
3520 {
3521 return gl::error(GL_INVALID_ENUM);
3522 }
3523 *params = texture->getWrapR();
3524 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003525 case GL_TEXTURE_IMMUTABLE_FORMAT:
3526 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003527 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3528 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003529 case GL_TEXTURE_IMMUTABLE_LEVELS:
3530 if (context->getClientVersion() < 3)
3531 {
3532 return gl::error(GL_INVALID_ENUM);
3533 }
Jamie Madill51a94372013-10-24 17:49:43 -04003534 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003535 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003536 case GL_TEXTURE_USAGE_ANGLE:
3537 *params = texture->getUsage();
3538 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003539 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003540 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003542 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003543 }
3544 *params = (GLint)texture->getMaxAnisotropy();
3545 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003546 case GL_TEXTURE_SWIZZLE_R:
3547 if (context->getClientVersion() < 3)
3548 {
3549 return gl::error(GL_INVALID_ENUM);
3550 }
3551 *params = texture->getSwizzleRed();
3552 break;
3553 case GL_TEXTURE_SWIZZLE_G:
3554 if (context->getClientVersion() < 3)
3555 {
3556 return gl::error(GL_INVALID_ENUM);
3557 }
3558 *params = texture->getSwizzleGreen();
3559 break;
3560 case GL_TEXTURE_SWIZZLE_B:
3561 if (context->getClientVersion() < 3)
3562 {
3563 return gl::error(GL_INVALID_ENUM);
3564 }
3565 *params = texture->getSwizzleBlue();
3566 break;
3567 case GL_TEXTURE_SWIZZLE_A:
3568 if (context->getClientVersion() < 3)
3569 {
3570 return gl::error(GL_INVALID_ENUM);
3571 }
3572 *params = texture->getSwizzleAlpha();
3573 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003574 case GL_TEXTURE_BASE_LEVEL:
3575 if (context->getClientVersion() < 3)
3576 {
3577 return gl::error(GL_INVALID_ENUM);
3578 }
3579 *params = texture->getBaseLevel();
3580 break;
3581 case GL_TEXTURE_MAX_LEVEL:
3582 if (context->getClientVersion() < 3)
3583 {
3584 return gl::error(GL_INVALID_ENUM);
3585 }
3586 *params = texture->getMaxLevel();
3587 break;
3588 case GL_TEXTURE_MIN_LOD:
3589 if (context->getClientVersion() < 3)
3590 {
3591 return gl::error(GL_INVALID_ENUM);
3592 }
3593 *params = (GLint)texture->getMinLod();
3594 break;
3595 case GL_TEXTURE_MAX_LOD:
3596 if (context->getClientVersion() < 3)
3597 {
3598 return gl::error(GL_INVALID_ENUM);
3599 }
3600 *params = (GLint)texture->getMaxLod();
3601 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003602 default:
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 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003606 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003607 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003610 }
3611}
3612
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003613void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3614{
3615 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3616 program, location, bufSize, params);
3617
3618 try
3619 {
3620 if (bufSize < 0)
3621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003623 }
3624
3625 gl::Context *context = gl::getNonLostContext();
3626
3627 if (context)
3628 {
3629 if (program == 0)
3630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003632 }
3633
3634 gl::Program *programObject = context->getProgram(program);
3635
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003636 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003638 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003639 }
3640
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003641 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3642 if (!programBinary)
3643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003644 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003645 }
3646
3647 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003650 }
3651 }
3652 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003653 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003656 }
3657}
3658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003659void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003661 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003662
3663 try
3664 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003665 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003666
3667 if (context)
3668 {
3669 if (program == 0)
3670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003671 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003672 }
3673
3674 gl::Program *programObject = context->getProgram(program);
3675
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003676 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003678 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003679 }
3680
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003681 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3682 if (!programBinary)
3683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003685 }
3686
3687 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003689 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003690 }
3691 }
3692 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003693 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003695 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003696 }
3697}
3698
3699void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3700{
3701 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3702 program, location, bufSize, params);
3703
3704 try
3705 {
3706 if (bufSize < 0)
3707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003708 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003709 }
3710
3711 gl::Context *context = gl::getNonLostContext();
3712
3713 if (context)
3714 {
3715 if (program == 0)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003718 }
3719
3720 gl::Program *programObject = context->getProgram(program);
3721
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003722 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003725 }
3726
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003727 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3728 if (!programBinary)
3729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003730 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003731 }
3732
3733 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003736 }
3737 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003738 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003739 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003742 }
3743}
3744
3745void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003747 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003748
3749 try
3750 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003751 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003752
3753 if (context)
3754 {
3755 if (program == 0)
3756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003757 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003758 }
3759
3760 gl::Program *programObject = context->getProgram(program);
3761
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003762 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003764 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003765 }
3766
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003767 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3768 if (!programBinary)
3769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003770 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003771 }
3772
3773 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003775 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003776 }
3777 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003779 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003782 }
3783}
3784
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003785int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003787 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003788
3789 try
3790 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003792
3793 if (strstr(name, "gl_") == name)
3794 {
3795 return -1;
3796 }
3797
3798 if (context)
3799 {
3800 gl::Program *programObject = context->getProgram(program);
3801
3802 if (!programObject)
3803 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003804 if (context->getShader(program))
3805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003806 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003807 }
3808 else
3809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003811 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 }
3813
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003814 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003815 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003817 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003818 }
3819
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003820 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003821 }
3822 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003823 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826 }
3827
3828 return -1;
3829}
3830
3831void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003833 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003834
3835 try
3836 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003838
daniel@transgaming.come0078962010-04-15 20:45:08 +00003839 if (context)
3840 {
3841 if (index >= gl::MAX_VERTEX_ATTRIBS)
3842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003844 }
3845
daniel@transgaming.com83921382011-01-08 05:46:00 +00003846 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003847
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003848 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003849 {
Jamie Madillaff71502013-07-02 11:57:05 -04003850 return;
3851 }
3852
3853 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3854 {
3855 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3856 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003857 {
Jamie Madillaff71502013-07-02 11:57:05 -04003858 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003859 }
Jamie Madillaff71502013-07-02 11:57:05 -04003860 }
3861 else
3862 {
3863 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003864 }
3865 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003867 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870 }
3871}
3872
3873void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003875 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876
3877 try
3878 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003879 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880
daniel@transgaming.come0078962010-04-15 20:45:08 +00003881 if (context)
3882 {
3883 if (index >= gl::MAX_VERTEX_ATTRIBS)
3884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003885 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003886 }
3887
daniel@transgaming.com83921382011-01-08 05:46:00 +00003888 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003889
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003890 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003891 {
Jamie Madillaff71502013-07-02 11:57:05 -04003892 return;
3893 }
3894
3895 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3896 {
3897 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3898 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003899 {
Jamie Madillaff71502013-07-02 11:57:05 -04003900 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003901 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003902 }
Jamie Madillaff71502013-07-02 11:57:05 -04003903 }
3904 else
3905 {
3906 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003907 }
3908 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003909 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003910 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003912 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003913 }
3914}
3915
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003916void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003917{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003918 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003919
3920 try
3921 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003922 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923
daniel@transgaming.come0078962010-04-15 20:45:08 +00003924 if (context)
3925 {
3926 if (index >= gl::MAX_VERTEX_ATTRIBS)
3927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003928 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003929 }
3930
3931 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003933 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003934 }
3935
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003936 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003937 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003938 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003939 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003941 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003942 }
3943}
3944
3945void __stdcall glHint(GLenum target, GLenum mode)
3946{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003947 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003948
3949 try
3950 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003951 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003952 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003953 case GL_FASTEST:
3954 case GL_NICEST:
3955 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003956 break;
3957 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003959 }
3960
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003961 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003962 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003963 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003964 case GL_GENERATE_MIPMAP_HINT:
3965 if (context) context->setGenerateMipmapHint(mode);
3966 break;
3967 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3968 if (context) context->setFragmentShaderDerivativeHint(mode);
3969 break;
3970 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003972 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003974 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977 }
3978}
3979
3980GLboolean __stdcall glIsBuffer(GLuint buffer)
3981{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003982 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983
3984 try
3985 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003986 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003987
3988 if (context && buffer)
3989 {
3990 gl::Buffer *bufferObject = context->getBuffer(buffer);
3991
3992 if (bufferObject)
3993 {
3994 return GL_TRUE;
3995 }
3996 }
3997 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003998 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004000 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 }
4002
4003 return GL_FALSE;
4004}
4005
4006GLboolean __stdcall glIsEnabled(GLenum cap)
4007{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004008 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004009
4010 try
4011 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004012 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013
4014 if (context)
4015 {
Geoff Lang0550d032014-01-30 11:29:07 -05004016 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004018 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 }
Geoff Lang0550d032014-01-30 11:29:07 -05004020
4021 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022 }
4023 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004024 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027 }
4028
4029 return false;
4030}
4031
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004032GLboolean __stdcall glIsFenceNV(GLuint fence)
4033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004034 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004035
4036 try
4037 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004038 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004039
4040 if (context)
4041 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004042 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004043
4044 if (fenceObject == NULL)
4045 {
4046 return GL_FALSE;
4047 }
4048
4049 return fenceObject->isFence();
4050 }
4051 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004052 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004054 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004055 }
4056
4057 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004058}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004059
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004060GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004062 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063
4064 try
4065 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004066 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067
4068 if (context && framebuffer)
4069 {
4070 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4071
4072 if (framebufferObject)
4073 {
4074 return GL_TRUE;
4075 }
4076 }
4077 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004078 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004080 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004081 }
4082
4083 return GL_FALSE;
4084}
4085
4086GLboolean __stdcall glIsProgram(GLuint program)
4087{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004088 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004089
4090 try
4091 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004092 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093
4094 if (context && program)
4095 {
4096 gl::Program *programObject = context->getProgram(program);
4097
4098 if (programObject)
4099 {
4100 return GL_TRUE;
4101 }
4102 }
4103 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004104 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004106 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004107 }
4108
4109 return GL_FALSE;
4110}
4111
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004112GLboolean __stdcall glIsQueryEXT(GLuint id)
4113{
4114 EVENT("(GLuint id = %d)", id);
4115
4116 try
4117 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004118 gl::Context *context = gl::getNonLostContext();
4119
4120 if (context)
4121 {
Geoff Lang37dde692014-01-31 16:34:54 -05004122 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004123 }
4124 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004125 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004127 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004128 }
4129
4130 return GL_FALSE;
4131}
4132
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004133GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004135 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136
4137 try
4138 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004140
4141 if (context && renderbuffer)
4142 {
Jamie Madill6c7b4ad2014-06-16 10:33:59 -04004143 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144
4145 if (renderbufferObject)
4146 {
4147 return GL_TRUE;
4148 }
4149 }
4150 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004151 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004153 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154 }
4155
4156 return GL_FALSE;
4157}
4158
4159GLboolean __stdcall glIsShader(GLuint shader)
4160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004161 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004162
4163 try
4164 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004166
4167 if (context && shader)
4168 {
4169 gl::Shader *shaderObject = context->getShader(shader);
4170
4171 if (shaderObject)
4172 {
4173 return GL_TRUE;
4174 }
4175 }
4176 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004177 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004179 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004180 }
4181
4182 return GL_FALSE;
4183}
4184
4185GLboolean __stdcall glIsTexture(GLuint texture)
4186{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004187 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004188
4189 try
4190 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004191 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004192
4193 if (context && texture)
4194 {
4195 gl::Texture *textureObject = context->getTexture(texture);
4196
4197 if (textureObject)
4198 {
4199 return GL_TRUE;
4200 }
4201 }
4202 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004203 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004205 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206 }
4207
4208 return GL_FALSE;
4209}
4210
4211void __stdcall glLineWidth(GLfloat width)
4212{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004213 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214
4215 try
4216 {
4217 if (width <= 0.0f)
4218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004219 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220 }
4221
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004222 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004223
4224 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004225 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004226 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227 }
4228 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004229 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004231 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004232 }
4233}
4234
4235void __stdcall glLinkProgram(GLuint program)
4236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004237 EVENT("(GLuint program = %d)", program);
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)
4244 {
4245 gl::Program *programObject = context->getProgram(program);
4246
4247 if (!programObject)
4248 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004249 if (context->getShader(program))
4250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004251 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004252 }
4253 else
4254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004255 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004256 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004257 }
4258
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004259 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260 }
4261 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004262 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004265 }
4266}
4267
4268void __stdcall glPixelStorei(GLenum pname, GLint param)
4269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004270 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004271
4272 try
4273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004275
4276 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004278 switch (pname)
4279 {
4280 case GL_UNPACK_ALIGNMENT:
4281 if (param != 1 && param != 2 && param != 4 && param != 8)
4282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004283 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004284 }
4285
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004286 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004287 break;
4288
4289 case GL_PACK_ALIGNMENT:
4290 if (param != 1 && param != 2 && param != 4 && param != 8)
4291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004293 }
4294
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004295 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004296 break;
4297
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004298 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4299 context->setPackReverseRowOrder(param != 0);
4300 break;
4301
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004302 case GL_UNPACK_IMAGE_HEIGHT:
4303 case GL_UNPACK_SKIP_IMAGES:
4304 case GL_UNPACK_ROW_LENGTH:
4305 case GL_UNPACK_SKIP_ROWS:
4306 case GL_UNPACK_SKIP_PIXELS:
4307 case GL_PACK_ROW_LENGTH:
4308 case GL_PACK_SKIP_ROWS:
4309 case GL_PACK_SKIP_PIXELS:
4310 if (context->getClientVersion() < 3)
4311 {
4312 return gl::error(GL_INVALID_ENUM);
4313 }
4314 UNIMPLEMENTED();
4315 break;
4316
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004317 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320 }
4321 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004322 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004324 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004325 }
4326}
4327
4328void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4329{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004330 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331
4332 try
4333 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004335
4336 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004338 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339 }
4340 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004341 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344 }
4345}
4346
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004347void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4348 GLenum format, GLenum type, GLsizei bufSize,
4349 GLvoid *data)
4350{
4351 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4352 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4353 x, y, width, height, format, type, bufSize, data);
4354
4355 try
4356 {
4357 if (width < 0 || height < 0 || bufSize < 0)
4358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004360 }
4361
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004362 gl::Context *context = gl::getNonLostContext();
4363
4364 if (context)
4365 {
Jamie Madill26e91952014-03-05 15:01:27 -05004366 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4367 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004368 {
Jamie Madill26e91952014-03-05 15:01:27 -05004369 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004370 }
4371
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004372 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4373 }
4374 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004375 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004378 }
4379}
4380
4381void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4382 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004384 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004385 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004386 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004387
4388 try
4389 {
4390 if (width < 0 || height < 0)
4391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004393 }
4394
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004395 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004396
4397 if (context)
4398 {
Jamie Madill26e91952014-03-05 15:01:27 -05004399 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4400 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004401 {
Jamie Madill26e91952014-03-05 15:01:27 -05004402 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004403 }
4404
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004405 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004406 }
4407 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004408 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411 }
4412}
4413
4414void __stdcall glReleaseShaderCompiler(void)
4415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004416 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417
4418 try
4419 {
4420 gl::Shader::releaseCompiler();
4421 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004422 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004424 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425 }
4426}
4427
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004428void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004430 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 +00004431 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004432
4433 try
4434 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436
4437 if (context)
4438 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004439 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004440 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004441 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004442 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004443 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004444
4445 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446 }
4447 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004448 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451 }
4452}
4453
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004454void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4455{
4456 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4457}
4458
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004459void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4460{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004461 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004462
4463 try
4464 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004465 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004466
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004467 if (context)
4468 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004469 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004470 }
4471 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004472 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004475 }
4476}
4477
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004478void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004480 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004481
4482 try
4483 {
4484 if (condition != GL_ALL_COMPLETED_NV)
4485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004486 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004487 }
4488
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004489 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004490
4491 if (context)
4492 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004493 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004494
4495 if (fenceObject == NULL)
4496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004497 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004498 }
4499
4500 fenceObject->setFence(condition);
4501 }
4502 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004503 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004505 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004506 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004507}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004508
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004509void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004511 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 +00004512
4513 try
4514 {
4515 if (width < 0 || height < 0)
4516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004517 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518 }
4519
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004520 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 if (context)
4523 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004524 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525 }
4526 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004527 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004530 }
4531}
4532
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004533void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004535 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004536 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004537 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538
4539 try
4540 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004541 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004544 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004547 }
4548}
4549
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004550void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004552 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 +00004553 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554
4555 try
4556 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004557 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004559 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560 }
4561
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563
4564 if (context)
4565 {
4566 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 if (!shaderObject)
4569 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004570 if (context->getProgram(shader))
4571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004573 }
4574 else
4575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004576 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 }
4579
4580 shaderObject->setSource(count, string, length);
4581 }
4582 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004583 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004586 }
4587}
4588
4589void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4590{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004591 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592}
4593
4594void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004596 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 +00004597
4598 try
4599 {
4600 switch (face)
4601 {
4602 case GL_FRONT:
4603 case GL_BACK:
4604 case GL_FRONT_AND_BACK:
4605 break;
4606 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004607 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004608 }
4609
4610 switch (func)
4611 {
4612 case GL_NEVER:
4613 case GL_ALWAYS:
4614 case GL_LESS:
4615 case GL_LEQUAL:
4616 case GL_EQUAL:
4617 case GL_GEQUAL:
4618 case GL_GREATER:
4619 case GL_NOTEQUAL:
4620 break;
4621 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623 }
4624
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004625 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626
4627 if (context)
4628 {
4629 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4630 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004631 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633
4634 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4635 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004636 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 }
4638 }
4639 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004640 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643 }
4644}
4645
4646void __stdcall glStencilMask(GLuint mask)
4647{
4648 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4649}
4650
4651void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004653 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654
4655 try
4656 {
4657 switch (face)
4658 {
4659 case GL_FRONT:
4660 case GL_BACK:
4661 case GL_FRONT_AND_BACK:
4662 break;
4663 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004664 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004665 }
4666
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004667 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004668
4669 if (context)
4670 {
4671 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4672 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004673 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674 }
4675
4676 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4677 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004678 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679 }
4680 }
4681 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004682 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004684 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004685 }
4686}
4687
4688void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4689{
4690 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4691}
4692
4693void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004695 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 +00004696 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004697
4698 try
4699 {
4700 switch (face)
4701 {
4702 case GL_FRONT:
4703 case GL_BACK:
4704 case GL_FRONT_AND_BACK:
4705 break;
4706 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004707 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004708 }
4709
4710 switch (fail)
4711 {
4712 case GL_ZERO:
4713 case GL_KEEP:
4714 case GL_REPLACE:
4715 case GL_INCR:
4716 case GL_DECR:
4717 case GL_INVERT:
4718 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004719 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 break;
4721 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004722 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004723 }
4724
4725 switch (zfail)
4726 {
4727 case GL_ZERO:
4728 case GL_KEEP:
4729 case GL_REPLACE:
4730 case GL_INCR:
4731 case GL_DECR:
4732 case GL_INVERT:
4733 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004734 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735 break;
4736 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738 }
4739
4740 switch (zpass)
4741 {
4742 case GL_ZERO:
4743 case GL_KEEP:
4744 case GL_REPLACE:
4745 case GL_INCR:
4746 case GL_DECR:
4747 case GL_INVERT:
4748 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004749 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750 break;
4751 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004752 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753 }
4754
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004755 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756
4757 if (context)
4758 {
4759 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4760 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004761 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762 }
4763
4764 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4765 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004766 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004767 }
4768 }
4769 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004770 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773 }
4774}
4775
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004776GLboolean __stdcall glTestFenceNV(GLuint fence)
4777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004778 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004779
4780 try
4781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004782 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004783
4784 if (context)
4785 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004786 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004787
4788 if (fenceObject == NULL)
4789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004790 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004791 }
4792
Jamie Madillfb9a7402013-07-26 11:55:01 -04004793 if (fenceObject->isFence() != GL_TRUE)
4794 {
4795 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4796 }
4797
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004798 return fenceObject->testFence();
4799 }
4800 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004801 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004803 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004804 }
4805
4806 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004807}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004808
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004809void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4810 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004812 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004813 "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 +00004814 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815
4816 try
4817 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004818 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819
4820 if (context)
4821 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004822 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004823 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004824 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004825 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004826 return;
4827 }
4828
4829 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004830 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004831 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004832 {
4833 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004834 }
4835
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004836 switch (target)
4837 {
4838 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004839 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004840 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004841 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004842 }
4843 break;
4844 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004845 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004846 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004847 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004849 break;
4850 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4851 {
4852 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004853 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004854 }
4855 break;
4856 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4857 {
4858 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004859 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004860 }
4861 break;
4862 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4863 {
4864 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004865 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004866 }
4867 break;
4868 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4869 {
4870 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004871 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004872 }
4873 break;
4874 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4875 {
4876 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004877 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004878 }
4879 break;
4880 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881 }
4882 }
4883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004884 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004886 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004887 }
4888}
4889
4890void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4891{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004892 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4893
4894 try
4895 {
4896 gl::Context *context = gl::getNonLostContext();
4897
4898 if (context)
4899 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004900 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004901 {
4902 return;
4903 }
4904
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004905 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004906
Jamie Madillfb8a8302013-07-03 14:24:12 -04004907 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004909 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004910 }
4911
4912 switch (pname)
4913 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004914 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4915 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4916 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4917 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4918 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4919 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langcec35902014-04-16 10:52:36 -04004920 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004921 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4922 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004923 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4924 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4925 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4926 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004927 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
4928 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
4929 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
4930 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004931 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004932 }
4933 }
4934 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004935 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004937 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004938 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939}
4940
4941void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4942{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004943 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944}
4945
4946void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004948 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949
4950 try
4951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004953
4954 if (context)
4955 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004956 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004957 {
4958 return;
4959 }
4960
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004961 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962
Jamie Madillfb8a8302013-07-03 14:24:12 -04004963 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004965 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966 }
4967
4968 switch (pname)
4969 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004970 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
4971 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
4972 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
4973 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
4974 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
4975 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langcec35902014-04-16 10:52:36 -04004976 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004977 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
4978 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004979 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
4980 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
4981 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
4982 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004983 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
4984 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
4985 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
4986 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004987 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988 }
4989 }
4990 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004991 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004993 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994 }
4995}
4996
4997void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4998{
4999 glTexParameteri(target, pname, *params);
5000}
5001
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005002void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5003{
5004 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5005 target, levels, internalformat, width, height);
5006
5007 try
5008 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005009 gl::Context *context = gl::getNonLostContext();
5010
5011 if (context)
5012 {
Geoff Langcec35902014-04-16 10:52:36 -04005013 if (!context->getCaps().extensions.textureStorage)
5014 {
5015 return gl::error(GL_INVALID_OPERATION);
5016 }
5017
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005018 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005019 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005020 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005021 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005022 }
5023
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005024 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005025 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005026 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005027 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005028 }
5029
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005030 switch (target)
5031 {
5032 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005033 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005034 gl::Texture2D *texture2d = context->getTexture2D();
5035 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005036 }
5037 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005038
Geoff Lang01c21d22013-09-24 11:52:16 -04005039 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005040 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005041 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5042 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005043 }
5044 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005045
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005046 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005047 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005048 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005049 }
5050 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005051 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005053 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005054 }
5055}
5056
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005057void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5058 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005059{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005060 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005061 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005062 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 target, level, xoffset, yoffset, width, height, format, type, pixels);
5064
5065 try
5066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005068
5069 if (context)
5070 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005071 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005072 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005073 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005074 {
5075 return;
5076 }
5077
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005078 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005079 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005080 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005081 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005082 return;
5083 }
5084
Geoff Langc41e42d2014-04-28 10:58:16 -04005085 // Zero sized uploads are valid but no-ops
5086 if (width == 0 || height == 0)
5087 {
5088 return;
5089 }
5090
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005091 switch (target)
5092 {
5093 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005094 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005095 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005096 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005097 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005098 break;
5099
5100 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5101 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5102 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5103 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5104 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5105 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005106 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005107 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005108 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005109 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005110 break;
5111
5112 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005113 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005114 }
5115 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005116 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005117 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005120 }
5121}
5122
5123void __stdcall glUniform1f(GLint location, GLfloat x)
5124{
5125 glUniform1fv(location, 1, &x);
5126}
5127
5128void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005130 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005131
5132 try
5133 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005134 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005135
5136 if (context)
5137 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005138 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005139 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005140 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005141 }
5142
Jamie Madillaa981bd2014-05-20 10:55:55 -04005143 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005144 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005145 }
5146 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005147 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150 }
5151}
5152
5153void __stdcall glUniform1i(GLint location, GLint x)
5154{
5155 glUniform1iv(location, 1, &x);
5156}
5157
5158void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005160 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005161
5162 try
5163 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165
5166 if (context)
5167 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005168 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005169 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005170 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005171 }
5172
Jamie Madillaa981bd2014-05-20 10:55:55 -04005173 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005174 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005175 }
5176 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005177 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181}
5182
5183void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5184{
5185 GLfloat xy[2] = {x, y};
5186
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005187 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188}
5189
5190void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005192 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005193
5194 try
5195 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005196 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197
5198 if (context)
5199 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005200 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005201 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005202 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005203 }
5204
Jamie Madillaa981bd2014-05-20 10:55:55 -04005205 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005206 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207 }
5208 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005209 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 }
5213}
5214
5215void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5216{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005217 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005219 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220}
5221
5222void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005224 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005225
5226 try
5227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005229
5230 if (context)
5231 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005232 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005233 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005234 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005235 }
5236
Jamie Madillaa981bd2014-05-20 10:55:55 -04005237 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005238 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005239 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005240 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005241 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244 }
5245}
5246
5247void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5248{
5249 GLfloat xyz[3] = {x, y, z};
5250
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005251 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005252}
5253
5254void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005256 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257
5258 try
5259 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005261
5262 if (context)
5263 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005264 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005265 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005266 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005267 }
5268
Jamie Madillaa981bd2014-05-20 10:55:55 -04005269 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005270 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271 }
5272 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005273 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005275 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276 }
5277}
5278
5279void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5280{
5281 GLint xyz[3] = {x, y, z};
5282
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005283 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284}
5285
5286void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005288 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005289
5290 try
5291 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005292 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005293
5294 if (context)
5295 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005296 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005297 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005298 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005299 }
5300
Jamie Madillaa981bd2014-05-20 10:55:55 -04005301 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005302 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005303 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005305 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308 }
5309}
5310
5311void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5312{
5313 GLfloat xyzw[4] = {x, y, z, w};
5314
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005315 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316}
5317
5318void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005320 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321
5322 try
5323 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325
5326 if (context)
5327 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005328 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005329 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005330 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005331 }
5332
Jamie Madillaa981bd2014-05-20 10:55:55 -04005333 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005334 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005337 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005339 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340 }
5341}
5342
5343void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5344{
5345 GLint xyzw[4] = {x, y, z, w};
5346
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005347 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005348}
5349
5350void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005352 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353
5354 try
5355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005357
5358 if (context)
5359 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005360 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005361 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005362 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005363 }
5364
Jamie Madillaa981bd2014-05-20 10:55:55 -04005365 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005366 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005367 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005369 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005371 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372 }
5373}
5374
5375void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5376{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005377 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005378 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005379
5380 try
5381 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005383
5384 if (context)
5385 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005386 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005387 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005388 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005389 }
5390
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005391 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005392 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005393 }
5394 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005395 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398 }
5399}
5400
5401void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5402{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005403 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005404 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405
5406 try
5407 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005408 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005409
5410 if (context)
5411 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005412 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005413 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005414 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005415 }
5416
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005417 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005418 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005419 }
5420 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005421 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005424 }
5425}
5426
5427void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5428{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005429 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005430 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431
5432 try
5433 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005435
5436 if (context)
5437 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005438 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005439 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005440 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005441 }
5442
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005443 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005444 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445 }
5446 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005447 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005449 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005450 }
5451}
5452
5453void __stdcall glUseProgram(GLuint program)
5454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005455 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456
5457 try
5458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460
5461 if (context)
5462 {
5463 gl::Program *programObject = context->getProgram(program);
5464
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005465 if (!programObject && program != 0)
5466 {
5467 if (context->getShader(program))
5468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005470 }
5471 else
5472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005473 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005474 }
5475 }
5476
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005477 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005479 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005480 }
5481
5482 context->useProgram(program);
5483 }
5484 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005485 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005487 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005488 }
5489}
5490
5491void __stdcall glValidateProgram(GLuint program)
5492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005493 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005494
5495 try
5496 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005497 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005498
5499 if (context)
5500 {
5501 gl::Program *programObject = context->getProgram(program);
5502
5503 if (!programObject)
5504 {
5505 if (context->getShader(program))
5506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005507 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005508 }
5509 else
5510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005511 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005512 }
5513 }
5514
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005515 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005517 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005518 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005521 }
5522}
5523
5524void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005526 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527
5528 try
5529 {
5530 if (index >= gl::MAX_VERTEX_ATTRIBS)
5531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005532 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533 }
5534
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005535 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005536
5537 if (context)
5538 {
5539 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005540 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005541 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005543 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 }
5547}
5548
5549void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005551 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552
5553 try
5554 {
5555 if (index >= gl::MAX_VERTEX_ATTRIBS)
5556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005558 }
5559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005561
5562 if (context)
5563 {
5564 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005565 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005566 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005568 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571 }
5572}
5573
5574void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005576 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577
5578 try
5579 {
5580 if (index >= gl::MAX_VERTEX_ATTRIBS)
5581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005582 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583 }
5584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005586
5587 if (context)
5588 {
5589 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005590 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005591 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005593 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005596 }
5597}
5598
5599void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005601 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602
5603 try
5604 {
5605 if (index >= gl::MAX_VERTEX_ATTRIBS)
5606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005608 }
5609
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005611
5612 if (context)
5613 {
5614 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005615 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005616 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005618 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 }
5622}
5623
5624void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005626 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 +00005627
5628 try
5629 {
5630 if (index >= gl::MAX_VERTEX_ATTRIBS)
5631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005632 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005633 }
5634
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005635 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005636
5637 if (context)
5638 {
5639 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005640 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005641 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005643 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005646 }
5647}
5648
5649void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005651 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005652
5653 try
5654 {
5655 if (index >= gl::MAX_VERTEX_ATTRIBS)
5656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005658 }
5659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005661
5662 if (context)
5663 {
5664 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005665 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005666 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005668 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 }
5672}
5673
5674void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005676 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 +00005677
5678 try
5679 {
5680 if (index >= gl::MAX_VERTEX_ATTRIBS)
5681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005683 }
5684
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005686
5687 if (context)
5688 {
5689 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005690 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005691 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005693 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005695 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005696 }
5697}
5698
5699void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5700{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005701 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005702
5703 try
5704 {
5705 if (index >= gl::MAX_VERTEX_ATTRIBS)
5706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005707 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708 }
5709
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005710 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005711
5712 if (context)
5713 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005714 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005715 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005717 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005720 }
5721}
5722
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005723void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5724{
5725 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5726
5727 try
5728 {
5729 if (index >= gl::MAX_VERTEX_ATTRIBS)
5730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005731 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005732 }
5733
5734 gl::Context *context = gl::getNonLostContext();
5735
5736 if (context)
5737 {
5738 context->setVertexAttribDivisor(index, divisor);
5739 }
5740 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005741 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005744 }
5745}
5746
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005747void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005749 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005750 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005751 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005752
5753 try
5754 {
5755 if (index >= gl::MAX_VERTEX_ATTRIBS)
5756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005757 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005758 }
5759
5760 if (size < 1 || size > 4)
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005763 }
5764
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005765 gl::Context *context = gl::getNonLostContext();
5766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005767 switch (type)
5768 {
5769 case GL_BYTE:
5770 case GL_UNSIGNED_BYTE:
5771 case GL_SHORT:
5772 case GL_UNSIGNED_SHORT:
5773 case GL_FIXED:
5774 case GL_FLOAT:
5775 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005776 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005777 case GL_INT:
5778 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005779 case GL_INT_2_10_10_10_REV:
5780 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005781 if (context && context->getClientVersion() < 3)
5782 {
5783 return gl::error(GL_INVALID_ENUM);
5784 }
5785 else
5786 {
5787 break;
5788 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005789 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005791 }
5792
5793 if (stride < 0)
5794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005795 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796 }
5797
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005798 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5799 {
5800 return gl::error(GL_INVALID_OPERATION);
5801 }
5802
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005803 if (context)
5804 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005805 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5806 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5807 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5808 // and the pointer argument is not NULL.
5809 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5810 {
5811 return gl::error(GL_INVALID_OPERATION);
5812 }
5813
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005814 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5815 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 }
5817 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005818 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005821 }
5822}
5823
5824void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005826 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 +00005827
5828 try
5829 {
5830 if (width < 0 || height < 0)
5831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005832 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833 }
5834
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836
5837 if (context)
5838 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005839 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005842 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005844 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845 }
5846}
5847
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005848// OpenGL ES 3.0 functions
5849
5850void __stdcall glReadBuffer(GLenum mode)
5851{
5852 EVENT("(GLenum mode = 0x%X)", mode);
5853
5854 try
5855 {
5856 gl::Context *context = gl::getNonLostContext();
5857
5858 if (context)
5859 {
5860 if (context->getClientVersion() < 3)
5861 {
5862 return gl::error(GL_INVALID_OPERATION);
5863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005864
Jamie Madill54133512013-06-21 09:33:07 -04005865 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005866 UNIMPLEMENTED();
5867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005868 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005869 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005870 {
5871 return gl::error(GL_OUT_OF_MEMORY);
5872 }
5873}
5874
5875void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5876{
5877 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5878 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5879
5880 try
5881 {
5882 gl::Context *context = gl::getNonLostContext();
5883
5884 if (context)
5885 {
5886 if (context->getClientVersion() < 3)
5887 {
5888 return gl::error(GL_INVALID_OPERATION);
5889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005890
Jamie Madill54133512013-06-21 09:33:07 -04005891 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005892 UNIMPLEMENTED();
5893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005894 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005895 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005896 {
5897 return gl::error(GL_OUT_OF_MEMORY);
5898 }
5899}
5900
5901void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5902{
5903 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5904 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5905 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5906 target, level, internalformat, width, height, depth, border, format, type, pixels);
5907
5908 try
5909 {
5910 gl::Context *context = gl::getNonLostContext();
5911
5912 if (context)
5913 {
5914 if (context->getClientVersion() < 3)
5915 {
5916 return gl::error(GL_INVALID_OPERATION);
5917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005918
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005919 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005920 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005921 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005922 {
5923 return;
5924 }
5925
5926 switch(target)
5927 {
5928 case GL_TEXTURE_3D:
5929 {
5930 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005931 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005932 }
5933 break;
5934
5935 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005936 {
5937 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005938 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005939 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005940 break;
5941
5942 default:
5943 return gl::error(GL_INVALID_ENUM);
5944 }
5945 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005946 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005947 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005948 {
5949 return gl::error(GL_OUT_OF_MEMORY);
5950 }
5951}
5952
5953void __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)
5954{
5955 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5956 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5957 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5958 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5959
5960 try
5961 {
5962 gl::Context *context = gl::getNonLostContext();
5963
5964 if (context)
5965 {
5966 if (context->getClientVersion() < 3)
5967 {
5968 return gl::error(GL_INVALID_OPERATION);
5969 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005970
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005971 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005972 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005973 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005974 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005975 {
5976 return;
5977 }
5978
Geoff Langc41e42d2014-04-28 10:58:16 -04005979 // Zero sized uploads are valid but no-ops
5980 if (width == 0 || height == 0 || depth == 0)
5981 {
5982 return;
5983 }
5984
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005985 switch(target)
5986 {
5987 case GL_TEXTURE_3D:
5988 {
5989 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005990 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 +00005991 }
5992 break;
5993
5994 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005995 {
5996 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005997 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 +00005998 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005999 break;
6000
6001 default:
6002 return gl::error(GL_INVALID_ENUM);
6003 }
6004 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006005 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006006 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006007 {
6008 return gl::error(GL_OUT_OF_MEMORY);
6009 }
6010}
6011
6012void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6013{
6014 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6015 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6016 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6017
6018 try
6019 {
6020 gl::Context *context = gl::getNonLostContext();
6021
6022 if (context)
6023 {
6024 if (context->getClientVersion() < 3)
6025 {
6026 return gl::error(GL_INVALID_OPERATION);
6027 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006028
Jamie Madill6f38f822014-06-06 17:12:20 -04006029 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006030 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006031 {
6032 return;
6033 }
6034
6035 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6036 gl::Texture *texture = NULL;
6037 switch (target)
6038 {
6039 case GL_TEXTURE_3D:
6040 texture = context->getTexture3D();
6041 break;
6042
6043 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006044 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006045 break;
6046
6047 default:
6048 return gl::error(GL_INVALID_ENUM);
6049 }
6050
6051 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6052 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006053 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006054 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006055 {
6056 return gl::error(GL_OUT_OF_MEMORY);
6057 }
6058}
6059
6060void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6061{
Geoff Langeef52cc2013-10-16 15:07:39 -04006062 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 +00006063 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6064 "const GLvoid* data = 0x%0.8p)",
6065 target, level, internalformat, width, height, depth, border, imageSize, data);
6066
6067 try
6068 {
6069 gl::Context *context = gl::getNonLostContext();
6070
6071 if (context)
6072 {
6073 if (context->getClientVersion() < 3)
6074 {
6075 return gl::error(GL_INVALID_OPERATION);
6076 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006077
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006078 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 +00006079 {
6080 return gl::error(GL_INVALID_VALUE);
6081 }
6082
6083 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006084 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006085 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006086 {
6087 return;
6088 }
6089
6090 switch(target)
6091 {
6092 case GL_TEXTURE_3D:
6093 {
6094 gl::Texture3D *texture = context->getTexture3D();
6095 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6096 }
6097 break;
6098
6099 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006100 {
6101 gl::Texture2DArray *texture = context->getTexture2DArray();
6102 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6103 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006104 break;
6105
6106 default:
6107 return gl::error(GL_INVALID_ENUM);
6108 }
6109 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006110 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006111 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006112 {
6113 return gl::error(GL_OUT_OF_MEMORY);
6114 }
6115}
6116
6117void __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)
6118{
6119 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6120 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6121 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6122 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6123
6124 try
6125 {
6126 gl::Context *context = gl::getNonLostContext();
6127
6128 if (context)
6129 {
6130 if (context->getClientVersion() < 3)
6131 {
6132 return gl::error(GL_INVALID_OPERATION);
6133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006134
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006135 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 +00006136 {
6137 return gl::error(GL_INVALID_VALUE);
6138 }
6139
6140 if (!data)
6141 {
6142 return gl::error(GL_INVALID_VALUE);
6143 }
6144
6145 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006146 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006147 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006148 {
6149 return;
6150 }
6151
Geoff Langc41e42d2014-04-28 10:58:16 -04006152 // Zero sized uploads are valid but no-ops
6153 if (width == 0 || height == 0)
6154 {
6155 return;
6156 }
6157
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006158 switch(target)
6159 {
6160 case GL_TEXTURE_3D:
6161 {
6162 gl::Texture3D *texture = context->getTexture3D();
6163 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6164 format, imageSize, data);
6165 }
6166 break;
6167
6168 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006169 {
6170 gl::Texture2DArray *texture = context->getTexture2DArray();
6171 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6172 format, imageSize, data);
6173 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006174 break;
6175
6176 default:
6177 return gl::error(GL_INVALID_ENUM);
6178 }
6179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006180 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006181 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006182 {
6183 return gl::error(GL_OUT_OF_MEMORY);
6184 }
6185}
6186
6187void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6188{
6189 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6190
6191 try
6192 {
6193 gl::Context *context = gl::getNonLostContext();
6194
6195 if (context)
6196 {
6197 if (context->getClientVersion() < 3)
6198 {
6199 return gl::error(GL_INVALID_OPERATION);
6200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006201
Geoff Lang37dde692014-01-31 16:34:54 -05006202 if (n < 0)
6203 {
6204 return gl::error(GL_INVALID_VALUE);
6205 }
6206
6207 for (GLsizei i = 0; i < n; i++)
6208 {
6209 ids[i] = context->createQuery();
6210 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006211 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006212 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006213 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006214 {
6215 return gl::error(GL_OUT_OF_MEMORY);
6216 }
6217}
6218
6219void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6220{
6221 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6222
6223 try
6224 {
6225 gl::Context *context = gl::getNonLostContext();
6226
6227 if (context)
6228 {
6229 if (context->getClientVersion() < 3)
6230 {
6231 return gl::error(GL_INVALID_OPERATION);
6232 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006233
Geoff Lang37dde692014-01-31 16:34:54 -05006234 if (n < 0)
6235 {
6236 return gl::error(GL_INVALID_VALUE);
6237 }
6238
6239 for (GLsizei i = 0; i < n; i++)
6240 {
6241 context->deleteQuery(ids[i]);
6242 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006244 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006245 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006246 {
6247 return gl::error(GL_OUT_OF_MEMORY);
6248 }
6249}
6250
6251GLboolean __stdcall glIsQuery(GLuint id)
6252{
6253 EVENT("(GLuint id = %u)", id);
6254
6255 try
6256 {
6257 gl::Context *context = gl::getNonLostContext();
6258
6259 if (context)
6260 {
6261 if (context->getClientVersion() < 3)
6262 {
6263 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006265
Geoff Lang37dde692014-01-31 16:34:54 -05006266 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006268 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006269 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006270 {
6271 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6272 }
6273
6274 return GL_FALSE;
6275}
6276
6277void __stdcall glBeginQuery(GLenum target, GLuint id)
6278{
6279 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6280
6281 try
6282 {
6283 gl::Context *context = gl::getNonLostContext();
6284
6285 if (context)
6286 {
6287 if (context->getClientVersion() < 3)
6288 {
6289 return gl::error(GL_INVALID_OPERATION);
6290 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006291
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006292 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006293 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006294 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006295 }
Geoff Lang37dde692014-01-31 16:34:54 -05006296 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006297 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006298 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006299 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006300 {
6301 return gl::error(GL_OUT_OF_MEMORY);
6302 }
6303}
6304
6305void __stdcall glEndQuery(GLenum target)
6306{
6307 EVENT("(GLenum target = 0x%X)", target);
6308
6309 try
6310 {
6311 gl::Context *context = gl::getNonLostContext();
6312
6313 if (context)
6314 {
6315 if (context->getClientVersion() < 3)
6316 {
6317 return gl::error(GL_INVALID_OPERATION);
6318 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006319
Jamie Madill45c785d2014-05-13 14:09:34 -04006320 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006321 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006322 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006323 }
Geoff Lang37dde692014-01-31 16:34:54 -05006324
6325 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006326 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006327 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006328 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006329 {
6330 return gl::error(GL_OUT_OF_MEMORY);
6331 }
6332}
6333
6334void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6335{
6336 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6337
6338 try
6339 {
6340 gl::Context *context = gl::getNonLostContext();
6341
6342 if (context)
6343 {
6344 if (context->getClientVersion() < 3)
6345 {
6346 return gl::error(GL_INVALID_OPERATION);
6347 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006348
Geoff Lang37dde692014-01-31 16:34:54 -05006349 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006350 {
Geoff Lang37dde692014-01-31 16:34:54 -05006351 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006352 }
Geoff Lang37dde692014-01-31 16:34:54 -05006353
6354 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006355 {
Geoff Lang37dde692014-01-31 16:34:54 -05006356 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006357 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006358 break;
6359
6360 default:
6361 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006362 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006364 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006365 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006366 {
6367 return gl::error(GL_OUT_OF_MEMORY);
6368 }
6369}
6370
6371void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6372{
6373 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6374
6375 try
6376 {
6377 gl::Context *context = gl::getNonLostContext();
6378
6379 if (context)
6380 {
6381 if (context->getClientVersion() < 3)
6382 {
6383 return gl::error(GL_INVALID_OPERATION);
6384 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006385
Geoff Lang37dde692014-01-31 16:34:54 -05006386 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6387
6388 if (!queryObject)
6389 {
6390 return gl::error(GL_INVALID_OPERATION);
6391 }
6392
Jamie Madill45c785d2014-05-13 14:09:34 -04006393 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006394 {
6395 return gl::error(GL_INVALID_OPERATION);
6396 }
6397
6398 switch(pname)
6399 {
6400 case GL_QUERY_RESULT:
6401 params[0] = queryObject->getResult();
6402 break;
6403 case GL_QUERY_RESULT_AVAILABLE:
6404 params[0] = queryObject->isResultAvailable();
6405 break;
6406 default:
6407 return gl::error(GL_INVALID_ENUM);
6408 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006409 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006410 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006411 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006412 {
6413 return gl::error(GL_OUT_OF_MEMORY);
6414 }
6415}
6416
6417GLboolean __stdcall glUnmapBuffer(GLenum target)
6418{
6419 EVENT("(GLenum target = 0x%X)", target);
6420
6421 try
6422 {
6423 gl::Context *context = gl::getNonLostContext();
6424
6425 if (context)
6426 {
6427 if (context->getClientVersion() < 3)
6428 {
6429 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6430 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006431
Shannon Woodsb3801742014-03-27 14:59:19 -04006432 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006433 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006434 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006435 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006436 {
6437 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6438 }
6439
6440 return GL_FALSE;
6441}
6442
6443void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6444{
6445 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6446
6447 try
6448 {
6449 gl::Context *context = gl::getNonLostContext();
6450
6451 if (context)
6452 {
6453 if (context->getClientVersion() < 3)
6454 {
6455 return gl::error(GL_INVALID_OPERATION);
6456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006457
Shannon Woodsb3801742014-03-27 14:59:19 -04006458 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006459 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006460 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006461 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006462 {
6463 return gl::error(GL_OUT_OF_MEMORY);
6464 }
6465}
6466
6467void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6468{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006469 try
6470 {
6471 gl::Context *context = gl::getNonLostContext();
6472
6473 if (context)
6474 {
6475 if (context->getClientVersion() < 3)
6476 {
6477 return gl::error(GL_INVALID_OPERATION);
6478 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006479
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006480 glDrawBuffersEXT(n, bufs);
6481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006482 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006483 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006484 {
6485 return gl::error(GL_OUT_OF_MEMORY);
6486 }
6487}
6488
6489void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6490{
6491 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6492 location, count, transpose, value);
6493
6494 try
6495 {
6496 gl::Context *context = gl::getNonLostContext();
6497
6498 if (context)
6499 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006500 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006501 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006502 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006503 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006504
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006505 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006506 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006507 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006508 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006509 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006510 {
6511 return gl::error(GL_OUT_OF_MEMORY);
6512 }
6513}
6514
6515void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6516{
6517 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6518 location, count, transpose, value);
6519
6520 try
6521 {
6522 gl::Context *context = gl::getNonLostContext();
6523
6524 if (context)
6525 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006526 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006527 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006528 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006529 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006530
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006531 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006532 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006534 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006535 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006536 {
6537 return gl::error(GL_OUT_OF_MEMORY);
6538 }
6539}
6540
6541void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6542{
6543 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6544 location, count, transpose, value);
6545
6546 try
6547 {
6548 gl::Context *context = gl::getNonLostContext();
6549
6550 if (context)
6551 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006552 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006553 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006554 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006555 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006556
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006557 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006558 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006560 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006561 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006562 {
6563 return gl::error(GL_OUT_OF_MEMORY);
6564 }
6565}
6566
6567void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6568{
6569 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6570 location, count, transpose, value);
6571
6572 try
6573 {
6574 gl::Context *context = gl::getNonLostContext();
6575
6576 if (context)
6577 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006578 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006579 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006580 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006582
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006583 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006584 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006585 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006586 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006587 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006588 {
6589 return gl::error(GL_OUT_OF_MEMORY);
6590 }
6591}
6592
6593void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6594{
6595 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6596 location, count, transpose, value);
6597
6598 try
6599 {
6600 gl::Context *context = gl::getNonLostContext();
6601
6602 if (context)
6603 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006604 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006605 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006606 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006608
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006609 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006610 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006612 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006613 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006614 {
6615 return gl::error(GL_OUT_OF_MEMORY);
6616 }
6617}
6618
6619void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6620{
6621 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6622 location, count, transpose, value);
6623
6624 try
6625 {
6626 gl::Context *context = gl::getNonLostContext();
6627
6628 if (context)
6629 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006630 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006631 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006632 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006634
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006635 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006636 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006637 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006638 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006639 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006640 {
6641 return gl::error(GL_OUT_OF_MEMORY);
6642 }
6643}
6644
6645void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6646{
6647 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6648 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6649 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6650
6651 try
6652 {
6653 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006654 if (context)
6655 {
6656 if (context->getClientVersion() < 3)
6657 {
6658 return gl::error(GL_INVALID_OPERATION);
6659 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006660
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006661 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006662 dstX0, dstY0, dstX1, dstY1, mask, filter,
6663 false))
6664 {
6665 return;
6666 }
6667
6668 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6669 mask, filter);
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
6678void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6679{
6680 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6681 target, samples, internalformat, width, height);
6682
6683 try
6684 {
6685 gl::Context *context = gl::getNonLostContext();
6686
6687 if (context)
6688 {
6689 if (context->getClientVersion() < 3)
6690 {
6691 return gl::error(GL_INVALID_OPERATION);
6692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006693
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006694 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006695 width, height, false))
6696 {
6697 return;
6698 }
6699
6700 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006701 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006702 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006703 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006704 {
6705 return gl::error(GL_OUT_OF_MEMORY);
6706 }
6707}
6708
6709void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6710{
6711 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6712 target, attachment, texture, level, layer);
6713
6714 try
6715 {
6716 gl::Context *context = gl::getNonLostContext();
6717
6718 if (context)
6719 {
6720 if (context->getClientVersion() < 3)
6721 {
6722 return gl::error(GL_INVALID_OPERATION);
6723 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006724
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006725 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006726 {
6727 return;
6728 }
6729
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006730 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6731 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006732
6733 gl::Texture *textureObject = context->getTexture(texture);
6734 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6735
6736 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6737 {
6738 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6739 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6740 }
6741 else
6742 {
6743 switch (attachment)
6744 {
6745 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6746 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6747 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6748 }
6749 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006751 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006752 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006753 {
6754 return gl::error(GL_OUT_OF_MEMORY);
6755 }
6756}
6757
6758GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6759{
6760 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6761 target, offset, length, access);
6762
6763 try
6764 {
6765 gl::Context *context = gl::getNonLostContext();
6766
6767 if (context)
6768 {
6769 if (context->getClientVersion() < 3)
6770 {
6771 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006773
Shannon Woods916e7692014-03-27 16:58:22 -04006774 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006775 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006776 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006777 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006778 {
6779 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6780 }
6781
6782 return NULL;
6783}
6784
6785void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6786{
6787 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6788
6789 try
6790 {
6791 gl::Context *context = gl::getNonLostContext();
6792
6793 if (context)
6794 {
6795 if (context->getClientVersion() < 3)
6796 {
6797 return gl::error(GL_INVALID_OPERATION);
6798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006799
Shannon Woods916e7692014-03-27 16:58:22 -04006800 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006802 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006803 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006804 {
6805 return gl::error(GL_OUT_OF_MEMORY);
6806 }
6807}
6808
6809void __stdcall glBindVertexArray(GLuint array)
6810{
6811 EVENT("(GLuint array = %u)", array);
6812
6813 try
6814 {
6815 gl::Context *context = gl::getNonLostContext();
6816
6817 if (context)
6818 {
6819 if (context->getClientVersion() < 3)
6820 {
6821 return gl::error(GL_INVALID_OPERATION);
6822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006823
Jamie Madilld1028542013-07-02 11:57:04 -04006824 gl::VertexArray *vao = context->getVertexArray(array);
6825
6826 if (!vao)
6827 {
6828 // The default VAO should always exist
6829 ASSERT(array != 0);
6830 return gl::error(GL_INVALID_OPERATION);
6831 }
6832
6833 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006834 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006835 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006836 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006837 {
6838 return gl::error(GL_OUT_OF_MEMORY);
6839 }
6840}
6841
6842void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6843{
6844 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6845
6846 try
6847 {
6848 gl::Context *context = gl::getNonLostContext();
6849
6850 if (context)
6851 {
6852 if (context->getClientVersion() < 3)
6853 {
6854 return gl::error(GL_INVALID_OPERATION);
6855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006856
Jamie Madilld1028542013-07-02 11:57:04 -04006857 if (n < 0)
6858 {
6859 return gl::error(GL_INVALID_VALUE);
6860 }
6861
6862 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6863 {
6864 if (arrays[arrayIndex] != 0)
6865 {
6866 context->deleteVertexArray(arrays[arrayIndex]);
6867 }
6868 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006869 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006870 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006871 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006872 {
6873 return gl::error(GL_OUT_OF_MEMORY);
6874 }
6875}
6876
6877void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6878{
6879 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6880
6881 try
6882 {
6883 gl::Context *context = gl::getNonLostContext();
6884
6885 if (context)
6886 {
6887 if (context->getClientVersion() < 3)
6888 {
6889 return gl::error(GL_INVALID_OPERATION);
6890 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006891
Jamie Madilld1028542013-07-02 11:57:04 -04006892 if (n < 0)
6893 {
6894 return gl::error(GL_INVALID_VALUE);
6895 }
6896
6897 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6898 {
6899 arrays[arrayIndex] = context->createVertexArray();
6900 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006901 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006903 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006904 {
6905 return gl::error(GL_OUT_OF_MEMORY);
6906 }
6907}
6908
6909GLboolean __stdcall glIsVertexArray(GLuint array)
6910{
6911 EVENT("(GLuint array = %u)", array);
6912
6913 try
6914 {
6915 gl::Context *context = gl::getNonLostContext();
6916
6917 if (context)
6918 {
6919 if (context->getClientVersion() < 3)
6920 {
6921 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006923
Jamie Madilld1028542013-07-02 11:57:04 -04006924 if (array == 0)
6925 {
6926 return GL_FALSE;
6927 }
6928
6929 gl::VertexArray *vao = context->getVertexArray(array);
6930
6931 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006932 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006933 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006934 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006935 {
6936 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6937 }
6938
6939 return GL_FALSE;
6940}
6941
6942void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
6943{
6944 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
6945 target, index, data);
6946
6947 try
6948 {
6949 gl::Context *context = gl::getNonLostContext();
6950
6951 if (context)
6952 {
6953 if (context->getClientVersion() < 3)
6954 {
6955 return gl::error(GL_INVALID_OPERATION);
6956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006957
Shannon Woods15934d52013-08-19 14:28:49 -04006958 switch (target)
6959 {
6960 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6961 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6962 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6963 if (index >= context->getMaxTransformFeedbackBufferBindings())
6964 return gl::error(GL_INVALID_VALUE);
6965 break;
6966 case GL_UNIFORM_BUFFER_START:
6967 case GL_UNIFORM_BUFFER_SIZE:
6968 case GL_UNIFORM_BUFFER_BINDING:
6969 if (index >= context->getMaximumCombinedUniformBufferBindings())
6970 return gl::error(GL_INVALID_VALUE);
6971 break;
6972 default:
6973 return gl::error(GL_INVALID_ENUM);
6974 }
6975
6976 if (!(context->getIndexedIntegerv(target, index, data)))
6977 {
6978 GLenum nativeType;
6979 unsigned int numParams = 0;
6980 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
6981 return gl::error(GL_INVALID_ENUM);
6982
6983 if (numParams == 0)
6984 return; // it is known that pname is valid, but there are no parameters to return
6985
6986 if (nativeType == GL_INT_64_ANGLEX)
6987 {
6988 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
6989 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
6990 GLint64 *int64Params = new GLint64[numParams];
6991
6992 context->getIndexedInteger64v(target, index, int64Params);
6993
6994 for (unsigned int i = 0; i < numParams; ++i)
6995 {
6996 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
6997 data[i] = static_cast<GLint>(clampedValue);
6998 }
6999
7000 delete [] int64Params;
7001 }
7002 else
7003 {
7004 UNREACHABLE();
7005 }
7006 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007008 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007009 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007010 {
7011 return gl::error(GL_OUT_OF_MEMORY);
7012 }
7013}
7014
7015void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7016{
7017 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7018
7019 try
7020 {
7021 gl::Context *context = gl::getNonLostContext();
7022
7023 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 Langc8058452014-02-03 12:04:11 -05007030 switch (primitiveMode)
7031 {
7032 case GL_TRIANGLES:
7033 case GL_LINES:
7034 case GL_POINTS:
7035 break;
7036 default:
7037 return gl::error(GL_INVALID_ENUM);
7038 }
7039
7040 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7041 ASSERT(transformFeedback != NULL);
7042
7043 if (transformFeedback->isStarted())
7044 {
7045 return gl::error(GL_INVALID_OPERATION);
7046 }
7047
7048 if (transformFeedback->isPaused())
7049 {
7050 transformFeedback->resume();
7051 }
7052 else
7053 {
7054 transformFeedback->start(primitiveMode);
7055 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007057 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007058 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007059 {
7060 return gl::error(GL_OUT_OF_MEMORY);
7061 }
7062}
7063
7064void __stdcall glEndTransformFeedback(void)
7065{
7066 EVENT("(void)");
7067
7068 try
7069 {
7070 gl::Context *context = gl::getNonLostContext();
7071
7072 if (context)
7073 {
7074 if (context->getClientVersion() < 3)
7075 {
7076 return gl::error(GL_INVALID_OPERATION);
7077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007078
Geoff Langc8058452014-02-03 12:04:11 -05007079 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7080 ASSERT(transformFeedback != NULL);
7081
7082 if (!transformFeedback->isStarted())
7083 {
7084 return gl::error(GL_INVALID_OPERATION);
7085 }
7086
7087 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007089 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007090 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007091 {
7092 return gl::error(GL_OUT_OF_MEMORY);
7093 }
7094}
7095
7096void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7097{
7098 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7099 target, index, buffer, offset, size);
7100
7101 try
7102 {
7103 gl::Context *context = gl::getNonLostContext();
7104
7105 if (context)
7106 {
7107 if (context->getClientVersion() < 3)
7108 {
7109 return gl::error(GL_INVALID_OPERATION);
7110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007111
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007112 switch (target)
7113 {
7114 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007115 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007116 {
7117 return gl::error(GL_INVALID_VALUE);
7118 }
7119 break;
7120
7121 case GL_UNIFORM_BUFFER:
7122 if (index >= context->getMaximumCombinedUniformBufferBindings())
7123 {
7124 return gl::error(GL_INVALID_VALUE);
7125 }
7126 break;
7127
7128 default:
7129 return gl::error(GL_INVALID_ENUM);
7130 }
7131
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007132 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007133 {
7134 return gl::error(GL_INVALID_VALUE);
7135 }
7136
7137 switch (target)
7138 {
7139 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007140
7141 // size and offset must be a multiple of 4
7142 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7143 {
7144 return gl::error(GL_INVALID_VALUE);
7145 }
7146
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007147 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7148 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007149 break;
7150
7151 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007152
7153 // it is an error to bind an offset not a multiple of the alignment
7154 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7155 {
7156 return gl::error(GL_INVALID_VALUE);
7157 }
7158
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007159 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7160 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007161 break;
7162
7163 default:
7164 UNREACHABLE();
7165 }
7166 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007168 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007169 {
7170 return gl::error(GL_OUT_OF_MEMORY);
7171 }
7172}
7173
7174void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7175{
7176 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7177 target, index, buffer);
7178
7179 try
7180 {
7181 gl::Context *context = gl::getNonLostContext();
7182
7183 if (context)
7184 {
7185 if (context->getClientVersion() < 3)
7186 {
7187 return gl::error(GL_INVALID_OPERATION);
7188 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007189
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007190 switch (target)
7191 {
7192 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007193 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007194 {
7195 return gl::error(GL_INVALID_VALUE);
7196 }
7197 break;
7198
7199 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007200 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007201 {
7202 return gl::error(GL_INVALID_VALUE);
7203 }
7204 break;
7205
7206 default:
7207 return gl::error(GL_INVALID_ENUM);
7208 }
7209
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007210 switch (target)
7211 {
7212 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007213 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007214 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007215 break;
7216
7217 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007218 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007219 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007220 break;
7221
7222 default:
7223 UNREACHABLE();
7224 }
7225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007226 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007227 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007228 {
7229 return gl::error(GL_OUT_OF_MEMORY);
7230 }
7231}
7232
7233void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7234{
7235 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7236 program, count, varyings, bufferMode);
7237
7238 try
7239 {
7240 gl::Context *context = gl::getNonLostContext();
7241
7242 if (context)
7243 {
7244 if (context->getClientVersion() < 3)
7245 {
7246 return gl::error(GL_INVALID_OPERATION);
7247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007248
Geoff Lang48dcae72014-02-05 16:28:24 -05007249 if (count < 0)
7250 {
7251 return gl::error(GL_INVALID_VALUE);
7252 }
7253
7254 switch (bufferMode)
7255 {
7256 case GL_INTERLEAVED_ATTRIBS:
7257 break;
7258 case GL_SEPARATE_ATTRIBS:
7259 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7260 {
7261 return gl::error(GL_INVALID_VALUE);
7262 }
7263 break;
7264 default:
7265 return gl::error(GL_INVALID_ENUM);
7266 }
7267
7268 if (!gl::ValidProgram(context, program))
7269 {
7270 return;
7271 }
7272
7273 gl::Program *programObject = context->getProgram(program);
7274 ASSERT(programObject);
7275
7276 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007278 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007279 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007280 {
7281 return gl::error(GL_OUT_OF_MEMORY);
7282 }
7283}
7284
7285void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7286{
7287 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7288 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7289 program, index, bufSize, length, size, type, name);
7290
7291 try
7292 {
7293 gl::Context *context = gl::getNonLostContext();
7294
7295 if (context)
7296 {
7297 if (context->getClientVersion() < 3)
7298 {
7299 return gl::error(GL_INVALID_OPERATION);
7300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007301
Geoff Lang48dcae72014-02-05 16:28:24 -05007302 if (bufSize < 0)
7303 {
7304 return gl::error(GL_INVALID_VALUE);
7305 }
7306
7307 if (!gl::ValidProgram(context, program))
7308 {
7309 return;
7310 }
7311
7312 gl::Program *programObject = context->getProgram(program);
7313 ASSERT(programObject);
7314
7315 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7316 {
7317 return gl::error(GL_INVALID_VALUE);
7318 }
7319
7320 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007323 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007324 {
7325 return gl::error(GL_OUT_OF_MEMORY);
7326 }
7327}
7328
7329void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7330{
7331 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7332 index, size, type, stride, pointer);
7333
7334 try
7335 {
7336 gl::Context *context = gl::getNonLostContext();
7337
7338 if (context)
7339 {
7340 if (context->getClientVersion() < 3)
7341 {
7342 return gl::error(GL_INVALID_OPERATION);
7343 }
7344 }
7345
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007346 if (index >= gl::MAX_VERTEX_ATTRIBS)
7347 {
7348 return gl::error(GL_INVALID_VALUE);
7349 }
7350
7351 if (size < 1 || size > 4)
7352 {
7353 return gl::error(GL_INVALID_VALUE);
7354 }
7355
7356 switch (type)
7357 {
7358 case GL_BYTE:
7359 case GL_UNSIGNED_BYTE:
7360 case GL_SHORT:
7361 case GL_UNSIGNED_SHORT:
7362 case GL_INT:
7363 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007364 case GL_INT_2_10_10_10_REV:
7365 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007366 break;
7367 default:
7368 return gl::error(GL_INVALID_ENUM);
7369 }
7370
7371 if (stride < 0)
7372 {
7373 return gl::error(GL_INVALID_VALUE);
7374 }
7375
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007376 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7377 {
7378 return gl::error(GL_INVALID_OPERATION);
7379 }
7380
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007381 if (context)
7382 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007383 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7384 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7385 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7386 // and the pointer argument is not NULL.
7387 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7388 {
7389 return gl::error(GL_INVALID_OPERATION);
7390 }
7391
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007392 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7393 stride, pointer);
7394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007395 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007396 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007397 {
7398 return gl::error(GL_OUT_OF_MEMORY);
7399 }
7400}
7401
7402void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7403{
7404 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7405 index, pname, params);
7406
7407 try
7408 {
7409 gl::Context *context = gl::getNonLostContext();
7410
7411 if (context)
7412 {
7413 if (context->getClientVersion() < 3)
7414 {
7415 return gl::error(GL_INVALID_OPERATION);
7416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007417
Jamie Madilla7d05862013-07-02 11:57:06 -04007418 if (index >= gl::MAX_VERTEX_ATTRIBS)
7419 {
7420 return gl::error(GL_INVALID_VALUE);
7421 }
7422
7423 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7424
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007425 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007426 {
7427 return;
7428 }
7429
7430 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7431 {
7432 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7433 for (int i = 0; i < 4; ++i)
7434 {
7435 params[i] = currentValueData.IntValues[i];
7436 }
7437 }
7438 else
7439 {
7440 *params = attribState.querySingleParameter<GLint>(pname);
7441 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007442 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007443 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007444 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007445 {
7446 return gl::error(GL_OUT_OF_MEMORY);
7447 }
7448}
7449
7450void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7451{
7452 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7453 index, pname, params);
7454
7455 try
7456 {
7457 gl::Context *context = gl::getNonLostContext();
7458
7459 if (context)
7460 {
7461 if (context->getClientVersion() < 3)
7462 {
7463 return gl::error(GL_INVALID_OPERATION);
7464 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007465
Jamie Madilla7d05862013-07-02 11:57:06 -04007466 if (index >= gl::MAX_VERTEX_ATTRIBS)
7467 {
7468 return gl::error(GL_INVALID_VALUE);
7469 }
7470
7471 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7472
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007473 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007474 {
7475 return;
7476 }
7477
7478 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7479 {
7480 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7481 for (int i = 0; i < 4; ++i)
7482 {
7483 params[i] = currentValueData.UnsignedIntValues[i];
7484 }
7485 }
7486 else
7487 {
7488 *params = attribState.querySingleParameter<GLuint>(pname);
7489 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007490 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007492 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007493 {
7494 return gl::error(GL_OUT_OF_MEMORY);
7495 }
7496}
7497
7498void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7499{
7500 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7501 index, x, y, z, w);
7502
7503 try
7504 {
7505 gl::Context *context = gl::getNonLostContext();
7506
7507 if (context)
7508 {
7509 if (context->getClientVersion() < 3)
7510 {
7511 return gl::error(GL_INVALID_OPERATION);
7512 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007513
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007514 if (index >= gl::MAX_VERTEX_ATTRIBS)
7515 {
7516 return gl::error(GL_INVALID_VALUE);
7517 }
7518
7519 GLint vals[4] = { x, y, z, w };
7520 context->setVertexAttribi(index, vals);
7521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007522 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007523 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007524 {
7525 return gl::error(GL_OUT_OF_MEMORY);
7526 }
7527}
7528
7529void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7530{
7531 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7532 index, x, y, z, w);
7533
7534 try
7535 {
7536 gl::Context *context = gl::getNonLostContext();
7537
7538 if (context)
7539 {
7540 if (context->getClientVersion() < 3)
7541 {
7542 return gl::error(GL_INVALID_OPERATION);
7543 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007544
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007545 if (index >= gl::MAX_VERTEX_ATTRIBS)
7546 {
7547 return gl::error(GL_INVALID_VALUE);
7548 }
7549
7550 GLuint vals[4] = { x, y, z, w };
7551 context->setVertexAttribu(index, vals);
7552 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007553 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007554 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007555 {
7556 return gl::error(GL_OUT_OF_MEMORY);
7557 }
7558}
7559
7560void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7561{
7562 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7563
7564 try
7565 {
7566 gl::Context *context = gl::getNonLostContext();
7567
7568 if (context)
7569 {
7570 if (context->getClientVersion() < 3)
7571 {
7572 return gl::error(GL_INVALID_OPERATION);
7573 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007574
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007575 if (index >= gl::MAX_VERTEX_ATTRIBS)
7576 {
7577 return gl::error(GL_INVALID_VALUE);
7578 }
7579
7580 context->setVertexAttribi(index, v);
7581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007582 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007583 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007584 {
7585 return gl::error(GL_OUT_OF_MEMORY);
7586 }
7587}
7588
7589void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7590{
7591 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7592
7593 try
7594 {
7595 gl::Context *context = gl::getNonLostContext();
7596
7597 if (context)
7598 {
7599 if (context->getClientVersion() < 3)
7600 {
7601 return gl::error(GL_INVALID_OPERATION);
7602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007603
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007604 if (index >= gl::MAX_VERTEX_ATTRIBS)
7605 {
7606 return gl::error(GL_INVALID_VALUE);
7607 }
7608
7609 context->setVertexAttribu(index, v);
7610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007611 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007612 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007613 {
7614 return gl::error(GL_OUT_OF_MEMORY);
7615 }
7616}
7617
7618void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7619{
7620 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7621 program, location, params);
7622
7623 try
7624 {
7625 gl::Context *context = gl::getNonLostContext();
7626
7627 if (context)
7628 {
7629 if (context->getClientVersion() < 3)
7630 {
7631 return gl::error(GL_INVALID_OPERATION);
7632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007633
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007634 if (program == 0)
7635 {
7636 return gl::error(GL_INVALID_VALUE);
7637 }
7638
7639 gl::Program *programObject = context->getProgram(program);
7640
7641 if (!programObject || !programObject->isLinked())
7642 {
7643 return gl::error(GL_INVALID_OPERATION);
7644 }
7645
7646 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7647 if (!programBinary)
7648 {
7649 return gl::error(GL_INVALID_OPERATION);
7650 }
7651
7652 if (!programBinary->getUniformuiv(location, NULL, params))
7653 {
7654 return gl::error(GL_INVALID_OPERATION);
7655 }
7656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007658 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007659 {
7660 return gl::error(GL_OUT_OF_MEMORY);
7661 }
7662}
7663
7664GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7665{
7666 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7667 program, name);
7668
7669 try
7670 {
7671 gl::Context *context = gl::getNonLostContext();
7672
7673 if (context)
7674 {
7675 if (context->getClientVersion() < 3)
7676 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007677 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007679
Jamie Madilld1e78c92013-06-20 11:55:50 -04007680 if (program == 0)
7681 {
7682 return gl::error(GL_INVALID_VALUE, -1);
7683 }
7684
7685 gl::Program *programObject = context->getProgram(program);
7686
7687 if (!programObject || !programObject->isLinked())
7688 {
7689 return gl::error(GL_INVALID_OPERATION, -1);
7690 }
7691
7692 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7693 if (!programBinary)
7694 {
7695 return gl::error(GL_INVALID_OPERATION, -1);
7696 }
7697
7698 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007700 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007701 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007702 {
7703 return gl::error(GL_OUT_OF_MEMORY, 0);
7704 }
7705
7706 return 0;
7707}
7708
7709void __stdcall glUniform1ui(GLint location, GLuint v0)
7710{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007711 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007712}
7713
7714void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7715{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007716 const GLuint xy[] = { v0, v1 };
7717 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007718}
7719
7720void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7721{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007722 const GLuint xyz[] = { v0, v1, v2 };
7723 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007724}
7725
7726void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7727{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007728 const GLuint xyzw[] = { v0, v1, v2, v3 };
7729 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007730}
7731
7732void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7733{
7734 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7735 location, count, value);
7736
7737 try
7738 {
7739 gl::Context *context = gl::getNonLostContext();
7740
7741 if (context)
7742 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007743 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007744 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007745 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007746 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007747
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007748 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007749 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007751 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007752 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007753 {
7754 return gl::error(GL_OUT_OF_MEMORY);
7755 }
7756}
7757
7758void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7759{
7760 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7761 location, count, value);
7762
7763 try
7764 {
7765 gl::Context *context = gl::getNonLostContext();
7766
7767 if (context)
7768 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007769 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007770 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007771 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007773
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007774 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007775 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007778 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007779 {
7780 return gl::error(GL_OUT_OF_MEMORY);
7781 }
7782}
7783
7784void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7785{
7786 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7787 location, count, value);
7788
7789 try
7790 {
7791 gl::Context *context = gl::getNonLostContext();
7792
7793 if (context)
7794 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007795 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007796 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007797 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007798 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007799
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007800 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007801 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007803 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007804 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007805 {
7806 return gl::error(GL_OUT_OF_MEMORY);
7807 }
7808}
7809
7810void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7811{
7812 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7813 location, count, value);
7814
7815 try
7816 {
7817 gl::Context *context = gl::getNonLostContext();
7818
7819 if (context)
7820 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007821 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007823 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007825
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007826 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007827 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007828 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007829 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007830 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007831 {
7832 return gl::error(GL_OUT_OF_MEMORY);
7833 }
7834}
7835
7836void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7837{
7838 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7839 buffer, drawbuffer, value);
7840
7841 try
7842 {
7843 gl::Context *context = gl::getNonLostContext();
7844
7845 if (context)
7846 {
7847 if (context->getClientVersion() < 3)
7848 {
7849 return gl::error(GL_INVALID_OPERATION);
7850 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007851
Geoff Lang42359ca2013-08-21 13:25:17 -04007852 switch (buffer)
7853 {
7854 case GL_COLOR:
7855 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7856 {
7857 return gl::error(GL_INVALID_VALUE);
7858 }
7859 break;
7860 case GL_STENCIL:
7861 if (drawbuffer != 0)
7862 {
7863 return gl::error(GL_INVALID_VALUE);
7864 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007865 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007866 default:
7867 return gl::error(GL_INVALID_ENUM);
7868 }
7869
7870 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007871 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007872 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007873 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007874 {
7875 return gl::error(GL_OUT_OF_MEMORY);
7876 }
7877}
7878
7879void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7880{
7881 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7882 buffer, drawbuffer, value);
7883
7884 try
7885 {
7886 gl::Context *context = gl::getNonLostContext();
7887
7888 if (context)
7889 {
7890 if (context->getClientVersion() < 3)
7891 {
7892 return gl::error(GL_INVALID_OPERATION);
7893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007894
Geoff Lang42359ca2013-08-21 13:25:17 -04007895 switch (buffer)
7896 {
7897 case GL_COLOR:
7898 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7899 {
7900 return gl::error(GL_INVALID_VALUE);
7901 }
7902 break;
7903 default:
7904 return gl::error(GL_INVALID_ENUM);
7905 }
7906
7907 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007909 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007910 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007911 {
7912 return gl::error(GL_OUT_OF_MEMORY);
7913 }
7914}
7915
7916void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
7917{
7918 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
7919 buffer, drawbuffer, value);
7920
7921 try
7922 {
7923 gl::Context *context = gl::getNonLostContext();
7924
7925 if (context)
7926 {
7927 if (context->getClientVersion() < 3)
7928 {
7929 return gl::error(GL_INVALID_OPERATION);
7930 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007931
Geoff Lang42359ca2013-08-21 13:25:17 -04007932 switch (buffer)
7933 {
7934 case GL_COLOR:
7935 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7936 {
7937 return gl::error(GL_INVALID_VALUE);
7938 }
7939 break;
7940 case GL_DEPTH:
7941 if (drawbuffer != 0)
7942 {
7943 return gl::error(GL_INVALID_VALUE);
7944 }
7945 break;
7946 default:
7947 return gl::error(GL_INVALID_ENUM);
7948 }
7949
7950 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007952 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007953 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007954 {
7955 return gl::error(GL_OUT_OF_MEMORY);
7956 }
7957}
7958
7959void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
7960{
7961 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
7962 buffer, drawbuffer, depth, stencil);
7963
7964 try
7965 {
7966 gl::Context *context = gl::getNonLostContext();
7967
7968 if (context)
7969 {
7970 if (context->getClientVersion() < 3)
7971 {
7972 return gl::error(GL_INVALID_OPERATION);
7973 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007974
Geoff Lang42359ca2013-08-21 13:25:17 -04007975 switch (buffer)
7976 {
7977 case GL_DEPTH_STENCIL:
7978 if (drawbuffer != 0)
7979 {
7980 return gl::error(GL_INVALID_VALUE);
7981 }
7982 break;
7983 default:
7984 return gl::error(GL_INVALID_ENUM);
7985 }
7986
7987 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007989 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007990 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007991 {
7992 return gl::error(GL_OUT_OF_MEMORY);
7993 }
7994}
7995
7996const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
7997{
7998 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
7999
8000 try
8001 {
8002 gl::Context *context = gl::getNonLostContext();
8003
8004 if (context)
8005 {
8006 if (context->getClientVersion() < 3)
8007 {
8008 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8009 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008010
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008011 if (name != GL_EXTENSIONS)
8012 {
8013 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8014 }
8015
Geoff Langcec35902014-04-16 10:52:36 -04008016 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008017 {
8018 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8019 }
Geoff Langcec35902014-04-16 10:52:36 -04008020
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008021 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8022 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008023 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008024 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008025 {
8026 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8027 }
8028
8029 return NULL;
8030}
8031
8032void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8033{
8034 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8035 readTarget, writeTarget, readOffset, writeOffset, size);
8036
8037 try
8038 {
8039 gl::Context *context = gl::getNonLostContext();
8040
8041 if (context)
8042 {
8043 if (context->getClientVersion() < 3)
8044 {
8045 return gl::error(GL_INVALID_OPERATION);
8046 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008047
Jamie Madill8c96d582014-03-05 15:01:23 -05008048 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008049 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008050 return gl::error(GL_INVALID_ENUM);
8051 }
8052
Jamie Madill8c96d582014-03-05 15:01:23 -05008053 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8054 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008055
8056 if (!readBuffer || !writeBuffer)
8057 {
8058 return gl::error(GL_INVALID_OPERATION);
8059 }
8060
Jamie Madill7a5f7382014-03-05 15:01:24 -05008061 if (readBuffer->mapped() || writeBuffer->mapped())
8062 {
8063 return gl::error(GL_INVALID_OPERATION);
8064 }
8065
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008066 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8067 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8068 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8069 {
8070 return gl::error(GL_INVALID_VALUE);
8071 }
8072
8073 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8074 {
8075 return gl::error(GL_INVALID_VALUE);
8076 }
8077
8078 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8079
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008080 // if size is zero, the copy is a successful no-op
8081 if (size > 0)
8082 {
8083 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8084 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008085 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008086 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008087 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008088 {
8089 return gl::error(GL_OUT_OF_MEMORY);
8090 }
8091}
8092
8093void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8094{
8095 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8096 program, uniformCount, uniformNames, uniformIndices);
8097
8098 try
8099 {
8100 gl::Context *context = gl::getNonLostContext();
8101
8102 if (context)
8103 {
8104 if (context->getClientVersion() < 3)
8105 {
8106 return gl::error(GL_INVALID_OPERATION);
8107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008109 if (uniformCount < 0)
8110 {
8111 return gl::error(GL_INVALID_VALUE);
8112 }
8113
8114 gl::Program *programObject = context->getProgram(program);
8115
8116 if (!programObject)
8117 {
8118 if (context->getShader(program))
8119 {
8120 return gl::error(GL_INVALID_OPERATION);
8121 }
8122 else
8123 {
8124 return gl::error(GL_INVALID_VALUE);
8125 }
8126 }
8127
8128 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8129 if (!programObject->isLinked() || !programBinary)
8130 {
8131 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8132 {
8133 uniformIndices[uniformId] = GL_INVALID_INDEX;
8134 }
8135 }
8136 else
8137 {
8138 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8139 {
8140 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8141 }
8142 }
8143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008144 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008145 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008146 {
8147 return gl::error(GL_OUT_OF_MEMORY);
8148 }
8149}
8150
8151void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8152{
8153 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8154 program, uniformCount, uniformIndices, pname, params);
8155
8156 try
8157 {
8158 gl::Context *context = gl::getNonLostContext();
8159
8160 if (context)
8161 {
8162 if (context->getClientVersion() < 3)
8163 {
8164 return gl::error(GL_INVALID_OPERATION);
8165 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008166
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008167 if (uniformCount < 0)
8168 {
8169 return gl::error(GL_INVALID_VALUE);
8170 }
8171
8172 gl::Program *programObject = context->getProgram(program);
8173
8174 if (!programObject)
8175 {
8176 if (context->getShader(program))
8177 {
8178 return gl::error(GL_INVALID_OPERATION);
8179 }
8180 else
8181 {
8182 return gl::error(GL_INVALID_VALUE);
8183 }
8184 }
8185
8186 switch (pname)
8187 {
8188 case GL_UNIFORM_TYPE:
8189 case GL_UNIFORM_SIZE:
8190 case GL_UNIFORM_NAME_LENGTH:
8191 case GL_UNIFORM_BLOCK_INDEX:
8192 case GL_UNIFORM_OFFSET:
8193 case GL_UNIFORM_ARRAY_STRIDE:
8194 case GL_UNIFORM_MATRIX_STRIDE:
8195 case GL_UNIFORM_IS_ROW_MAJOR:
8196 break;
8197 default:
8198 return gl::error(GL_INVALID_ENUM);
8199 }
8200
8201 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8202
8203 if (!programBinary && uniformCount > 0)
8204 {
8205 return gl::error(GL_INVALID_VALUE);
8206 }
8207
8208 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8209 {
8210 const GLuint index = uniformIndices[uniformId];
8211
8212 if (index >= (GLuint)programBinary->getActiveUniformCount())
8213 {
8214 return gl::error(GL_INVALID_VALUE);
8215 }
8216 }
8217
8218 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8219 {
8220 const GLuint index = uniformIndices[uniformId];
8221 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8222 }
8223 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008224 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008225 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008226 {
8227 return gl::error(GL_OUT_OF_MEMORY);
8228 }
8229}
8230
8231GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8232{
8233 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8234
8235 try
8236 {
8237 gl::Context *context = gl::getNonLostContext();
8238
8239 if (context)
8240 {
8241 if (context->getClientVersion() < 3)
8242 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008243 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008245
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008246 gl::Program *programObject = context->getProgram(program);
8247
8248 if (!programObject)
8249 {
8250 if (context->getShader(program))
8251 {
8252 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8253 }
8254 else
8255 {
8256 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8257 }
8258 }
8259
8260 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8261 if (!programBinary)
8262 {
8263 return GL_INVALID_INDEX;
8264 }
8265
8266 return programBinary->getUniformBlockIndex(uniformBlockName);
8267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008268 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008269 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008270 {
8271 return gl::error(GL_OUT_OF_MEMORY, 0);
8272 }
8273
8274 return 0;
8275}
8276
8277void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8278{
8279 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8280 program, uniformBlockIndex, pname, params);
8281
8282 try
8283 {
8284 gl::Context *context = gl::getNonLostContext();
8285
8286 if (context)
8287 {
8288 if (context->getClientVersion() < 3)
8289 {
8290 return gl::error(GL_INVALID_OPERATION);
8291 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008292 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008293
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008294 if (!programObject)
8295 {
8296 if (context->getShader(program))
8297 {
8298 return gl::error(GL_INVALID_OPERATION);
8299 }
8300 else
8301 {
8302 return gl::error(GL_INVALID_VALUE);
8303 }
8304 }
8305
8306 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8307
8308 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8309 {
8310 return gl::error(GL_INVALID_VALUE);
8311 }
8312
8313 switch (pname)
8314 {
8315 case GL_UNIFORM_BLOCK_BINDING:
8316 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8317 break;
8318
8319 case GL_UNIFORM_BLOCK_DATA_SIZE:
8320 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8321 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8322 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8323 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8324 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8325 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8326 break;
8327
8328 default:
8329 return gl::error(GL_INVALID_ENUM);
8330 }
8331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008332 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008333 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008334 {
8335 return gl::error(GL_OUT_OF_MEMORY);
8336 }
8337}
8338
8339void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8340{
8341 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8342 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8343
8344 try
8345 {
8346 gl::Context *context = gl::getNonLostContext();
8347
8348 if (context)
8349 {
8350 if (context->getClientVersion() < 3)
8351 {
8352 return gl::error(GL_INVALID_OPERATION);
8353 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008354
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008355 gl::Program *programObject = context->getProgram(program);
8356
8357 if (!programObject)
8358 {
8359 if (context->getShader(program))
8360 {
8361 return gl::error(GL_INVALID_OPERATION);
8362 }
8363 else
8364 {
8365 return gl::error(GL_INVALID_VALUE);
8366 }
8367 }
8368
8369 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8370
8371 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8372 {
8373 return gl::error(GL_INVALID_VALUE);
8374 }
8375
8376 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8377 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008378 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008379 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008380 {
8381 return gl::error(GL_OUT_OF_MEMORY);
8382 }
8383}
8384
8385void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8386{
8387 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8388 program, uniformBlockIndex, uniformBlockBinding);
8389
8390 try
8391 {
8392 gl::Context *context = gl::getNonLostContext();
8393
8394 if (context)
8395 {
8396 if (context->getClientVersion() < 3)
8397 {
8398 return gl::error(GL_INVALID_OPERATION);
8399 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008400
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008401 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8402 {
8403 return gl::error(GL_INVALID_VALUE);
8404 }
8405
8406 gl::Program *programObject = context->getProgram(program);
8407
8408 if (!programObject)
8409 {
8410 if (context->getShader(program))
8411 {
8412 return gl::error(GL_INVALID_OPERATION);
8413 }
8414 else
8415 {
8416 return gl::error(GL_INVALID_VALUE);
8417 }
8418 }
8419
8420 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8421
8422 // if never linked, there won't be any uniform blocks
8423 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8424 {
8425 return gl::error(GL_INVALID_VALUE);
8426 }
8427
8428 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008430 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008431 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008432 {
8433 return gl::error(GL_OUT_OF_MEMORY);
8434 }
8435}
8436
8437void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8438{
8439 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8440 mode, first, count, instanceCount);
8441
8442 try
8443 {
8444 gl::Context *context = gl::getNonLostContext();
8445
8446 if (context)
8447 {
8448 if (context->getClientVersion() < 3)
8449 {
8450 return gl::error(GL_INVALID_OPERATION);
8451 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008452
Jamie Madill54133512013-06-21 09:33:07 -04008453 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008454 UNIMPLEMENTED();
8455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008456 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008457 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008458 {
8459 return gl::error(GL_OUT_OF_MEMORY);
8460 }
8461}
8462
8463void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8464{
8465 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8466 mode, count, type, indices, instanceCount);
8467
8468 try
8469 {
8470 gl::Context *context = gl::getNonLostContext();
8471
8472 if (context)
8473 {
8474 if (context->getClientVersion() < 3)
8475 {
8476 return gl::error(GL_INVALID_OPERATION);
8477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008478
Jamie Madill54133512013-06-21 09:33:07 -04008479 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008480 UNIMPLEMENTED();
8481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008482 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008483 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008484 {
8485 return gl::error(GL_OUT_OF_MEMORY);
8486 }
8487}
8488
8489GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8490{
8491 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8492
8493 try
8494 {
8495 gl::Context *context = gl::getNonLostContext();
8496
8497 if (context)
8498 {
8499 if (context->getClientVersion() < 3)
8500 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008501 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008502 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008503
Jamie Madill5215e1a2013-07-26 11:55:19 -04008504 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8505 {
8506 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8507 }
8508
8509 if (flags != 0)
8510 {
8511 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8512 }
8513
8514 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008515 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008516 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008517 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008518 {
8519 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8520 }
8521
8522 return NULL;
8523}
8524
8525GLboolean __stdcall glIsSync(GLsync sync)
8526{
8527 EVENT("(GLsync sync = 0x%0.8p)", sync);
8528
8529 try
8530 {
8531 gl::Context *context = gl::getNonLostContext();
8532
8533 if (context)
8534 {
8535 if (context->getClientVersion() < 3)
8536 {
8537 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008539
Jamie Madill5215e1a2013-07-26 11:55:19 -04008540 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008541 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008542 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008543 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008544 {
8545 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8546 }
8547
8548 return GL_FALSE;
8549}
8550
8551void __stdcall glDeleteSync(GLsync sync)
8552{
8553 EVENT("(GLsync sync = 0x%0.8p)", sync);
8554
8555 try
8556 {
8557 gl::Context *context = gl::getNonLostContext();
8558
8559 if (context)
8560 {
8561 if (context->getClientVersion() < 3)
8562 {
8563 return gl::error(GL_INVALID_OPERATION);
8564 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008565
Jamie Madill5215e1a2013-07-26 11:55:19 -04008566 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8567 {
8568 return gl::error(GL_INVALID_VALUE);
8569 }
8570
8571 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008573 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008574 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008575 {
8576 return gl::error(GL_OUT_OF_MEMORY);
8577 }
8578}
8579
8580GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8581{
8582 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8583 sync, flags, timeout);
8584
8585 try
8586 {
8587 gl::Context *context = gl::getNonLostContext();
8588
8589 if (context)
8590 {
8591 if (context->getClientVersion() < 3)
8592 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008593 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008594 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008595
Jamie Madill5215e1a2013-07-26 11:55:19 -04008596 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8597 {
8598 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8599 }
8600
8601 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8602
8603 if (!fenceSync)
8604 {
8605 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8606 }
8607
8608 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008609 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008610 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008611 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008612 {
8613 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8614 }
8615
8616 return GL_FALSE;
8617}
8618
8619void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8620{
8621 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8622 sync, flags, timeout);
8623
8624 try
8625 {
8626 gl::Context *context = gl::getNonLostContext();
8627
8628 if (context)
8629 {
8630 if (context->getClientVersion() < 3)
8631 {
8632 return gl::error(GL_INVALID_OPERATION);
8633 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008634
Jamie Madill5215e1a2013-07-26 11:55:19 -04008635 if (flags != 0)
8636 {
8637 return gl::error(GL_INVALID_VALUE);
8638 }
8639
8640 if (timeout != GL_TIMEOUT_IGNORED)
8641 {
8642 return gl::error(GL_INVALID_VALUE);
8643 }
8644
8645 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8646
8647 if (!fenceSync)
8648 {
8649 return gl::error(GL_INVALID_VALUE);
8650 }
8651
8652 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008654 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008655 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008656 {
8657 return gl::error(GL_OUT_OF_MEMORY);
8658 }
8659}
8660
8661void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8662{
8663 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8664 pname, params);
8665
8666 try
8667 {
8668 gl::Context *context = gl::getNonLostContext();
8669
8670 if (context)
8671 {
8672 if (context->getClientVersion() < 3)
8673 {
8674 return gl::error(GL_INVALID_OPERATION);
8675 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008676
Jamie Madill79f2f452013-12-19 11:13:02 -05008677 GLenum nativeType;
8678 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008679 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8680 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008681 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008682 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008683
8684 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008685 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008686 context->getInteger64v(pname, params);
8687 }
Jamie Madill55856b12014-01-02 13:59:50 -05008688 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008689 {
Jamie Madill55856b12014-01-02 13:59:50 -05008690 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008691 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008693 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008694 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008695 {
8696 return gl::error(GL_OUT_OF_MEMORY);
8697 }
8698}
8699
8700void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8701{
8702 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8703 sync, pname, bufSize, length, values);
8704
8705 try
8706 {
8707 gl::Context *context = gl::getNonLostContext();
8708
8709 if (context)
8710 {
8711 if (context->getClientVersion() < 3)
8712 {
8713 return gl::error(GL_INVALID_OPERATION);
8714 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008715
Jamie Madill5215e1a2013-07-26 11:55:19 -04008716 if (bufSize < 0)
8717 {
8718 return gl::error(GL_INVALID_VALUE);
8719 }
8720
8721 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8722
8723 if (!fenceSync)
8724 {
8725 return gl::error(GL_INVALID_VALUE);
8726 }
8727
8728 switch (pname)
8729 {
8730 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8731 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8732 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8733 case GL_SYNC_FLAGS: values[0] = 0; break;
8734
8735 default:
8736 return gl::error(GL_INVALID_ENUM);
8737 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008738 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008739 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008740 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008741 {
8742 return gl::error(GL_OUT_OF_MEMORY);
8743 }
8744}
8745
8746void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8747{
8748 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8749 target, index, data);
8750
8751 try
8752 {
8753 gl::Context *context = gl::getNonLostContext();
8754
8755 if (context)
8756 {
8757 if (context->getClientVersion() < 3)
8758 {
8759 return gl::error(GL_INVALID_OPERATION);
8760 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008761
Shannon Woods15934d52013-08-19 14:28:49 -04008762 switch (target)
8763 {
8764 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8765 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8766 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8767 if (index >= context->getMaxTransformFeedbackBufferBindings())
8768 return gl::error(GL_INVALID_VALUE);
8769 break;
8770 case GL_UNIFORM_BUFFER_START:
8771 case GL_UNIFORM_BUFFER_SIZE:
8772 case GL_UNIFORM_BUFFER_BINDING:
8773 if (index >= context->getMaximumCombinedUniformBufferBindings())
8774 return gl::error(GL_INVALID_VALUE);
8775 break;
8776 default:
8777 return gl::error(GL_INVALID_ENUM);
8778 }
8779
8780 if (!(context->getIndexedInteger64v(target, index, data)))
8781 {
8782 GLenum nativeType;
8783 unsigned int numParams = 0;
8784 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8785 return gl::error(GL_INVALID_ENUM);
8786
8787 if (numParams == 0)
8788 return; // it is known that pname is valid, but there are no parameters to return
8789
8790 if (nativeType == GL_INT)
8791 {
8792 GLint *intParams = new GLint[numParams];
8793
8794 context->getIndexedIntegerv(target, index, intParams);
8795
8796 for (unsigned int i = 0; i < numParams; ++i)
8797 {
8798 data[i] = static_cast<GLint64>(intParams[i]);
8799 }
8800
8801 delete [] intParams;
8802 }
8803 else
8804 {
8805 UNREACHABLE();
8806 }
8807 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008809 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008810 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008811 {
8812 return gl::error(GL_OUT_OF_MEMORY);
8813 }
8814}
8815
8816void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8817{
8818 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8819 target, pname, params);
8820
8821 try
8822 {
8823 gl::Context *context = gl::getNonLostContext();
8824
8825 if (context)
8826 {
8827 if (context->getClientVersion() < 3)
8828 {
8829 return gl::error(GL_INVALID_OPERATION);
8830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008831
Jamie Madill70656a62014-03-05 15:01:26 -05008832 if (!gl::ValidBufferTarget(context, target))
8833 {
8834 return gl::error(GL_INVALID_ENUM);
8835 }
8836
8837 if (!gl::ValidBufferParameter(context, pname))
8838 {
8839 return gl::error(GL_INVALID_ENUM);
8840 }
8841
8842 gl::Buffer *buffer = context->getTargetBuffer(target);
8843
8844 if (!buffer)
8845 {
8846 // A null buffer means that "0" is bound to the requested buffer target
8847 return gl::error(GL_INVALID_OPERATION);
8848 }
8849
8850 switch (pname)
8851 {
8852 case GL_BUFFER_USAGE:
8853 *params = static_cast<GLint64>(buffer->usage());
8854 break;
8855 case GL_BUFFER_SIZE:
8856 *params = buffer->size();
8857 break;
8858 case GL_BUFFER_ACCESS_FLAGS:
8859 *params = static_cast<GLint64>(buffer->accessFlags());
8860 break;
8861 case GL_BUFFER_MAPPED:
8862 *params = static_cast<GLint64>(buffer->mapped());
8863 break;
8864 case GL_BUFFER_MAP_OFFSET:
8865 *params = buffer->mapOffset();
8866 break;
8867 case GL_BUFFER_MAP_LENGTH:
8868 *params = buffer->mapLength();
8869 break;
8870 default: UNREACHABLE(); break;
8871 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008872 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008873 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008874 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008875 {
8876 return gl::error(GL_OUT_OF_MEMORY);
8877 }
8878}
8879
8880void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8881{
8882 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8883
8884 try
8885 {
8886 gl::Context *context = gl::getNonLostContext();
8887
8888 if (context)
8889 {
8890 if (context->getClientVersion() < 3)
8891 {
8892 return gl::error(GL_INVALID_OPERATION);
8893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008894
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008895 if (count < 0)
8896 {
8897 return gl::error(GL_INVALID_VALUE);
8898 }
8899
8900 for (int i = 0; i < count; i++)
8901 {
8902 samplers[i] = context->createSampler();
8903 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008904 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008905 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008906 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008907 {
8908 return gl::error(GL_OUT_OF_MEMORY);
8909 }
8910}
8911
8912void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8913{
8914 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8915
8916 try
8917 {
8918 gl::Context *context = gl::getNonLostContext();
8919
8920 if (context)
8921 {
8922 if (context->getClientVersion() < 3)
8923 {
8924 return gl::error(GL_INVALID_OPERATION);
8925 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008926
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008927 if (count < 0)
8928 {
8929 return gl::error(GL_INVALID_VALUE);
8930 }
8931
8932 for (int i = 0; i < count; i++)
8933 {
8934 context->deleteSampler(samplers[i]);
8935 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008936 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008937 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008938 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008939 {
8940 return gl::error(GL_OUT_OF_MEMORY);
8941 }
8942}
8943
8944GLboolean __stdcall glIsSampler(GLuint sampler)
8945{
8946 EVENT("(GLuint sampler = %u)", sampler);
8947
8948 try
8949 {
8950 gl::Context *context = gl::getNonLostContext();
8951
8952 if (context)
8953 {
8954 if (context->getClientVersion() < 3)
8955 {
8956 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8957 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008958
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008959 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008960 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008961 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008962 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008963 {
8964 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8965 }
8966
8967 return GL_FALSE;
8968}
8969
8970void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8971{
8972 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8973
8974 try
8975 {
8976 gl::Context *context = gl::getNonLostContext();
8977
8978 if (context)
8979 {
8980 if (context->getClientVersion() < 3)
8981 {
8982 return gl::error(GL_INVALID_OPERATION);
8983 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008984
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008985 if (sampler != 0 && !context->isSampler(sampler))
8986 {
8987 return gl::error(GL_INVALID_OPERATION);
8988 }
8989
8990 if (unit >= context->getMaximumCombinedTextureImageUnits())
8991 {
8992 return gl::error(GL_INVALID_VALUE);
8993 }
8994
8995 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008996 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008997 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008998 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008999 {
9000 return gl::error(GL_OUT_OF_MEMORY);
9001 }
9002}
9003
9004void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9005{
9006 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9007
9008 try
9009 {
9010 gl::Context *context = gl::getNonLostContext();
9011
9012 if (context)
9013 {
9014 if (context->getClientVersion() < 3)
9015 {
9016 return gl::error(GL_INVALID_OPERATION);
9017 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009018
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009019 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009020 {
9021 return;
9022 }
9023
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009024 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009025 {
9026 return;
9027 }
9028
9029 if (!context->isSampler(sampler))
9030 {
9031 return gl::error(GL_INVALID_OPERATION);
9032 }
9033
9034 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009035 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009036 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009037 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009038 {
9039 return gl::error(GL_OUT_OF_MEMORY);
9040 }
9041}
9042
9043void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9044{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009045 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009046}
9047
9048void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9049{
9050 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9051
9052 try
9053 {
9054 gl::Context *context = gl::getNonLostContext();
9055
9056 if (context)
9057 {
9058 if (context->getClientVersion() < 3)
9059 {
9060 return gl::error(GL_INVALID_OPERATION);
9061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009062
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009063 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009064 {
9065 return;
9066 }
9067
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009068 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009069 {
9070 return;
9071 }
9072
9073 if (!context->isSampler(sampler))
9074 {
9075 return gl::error(GL_INVALID_OPERATION);
9076 }
9077
9078 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009080 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009081 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082 {
9083 return gl::error(GL_OUT_OF_MEMORY);
9084 }
9085}
9086
9087void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9088{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009089 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009090}
9091
9092void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9093{
9094 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9095
9096 try
9097 {
9098 gl::Context *context = gl::getNonLostContext();
9099
9100 if (context)
9101 {
9102 if (context->getClientVersion() < 3)
9103 {
9104 return gl::error(GL_INVALID_OPERATION);
9105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009106
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009107 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009108 {
9109 return;
9110 }
9111
9112 if (!context->isSampler(sampler))
9113 {
9114 return gl::error(GL_INVALID_OPERATION);
9115 }
9116
9117 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009118 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009119 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009120 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009121 {
9122 return gl::error(GL_OUT_OF_MEMORY);
9123 }
9124}
9125
9126void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9127{
9128 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9129
9130 try
9131 {
9132 gl::Context *context = gl::getNonLostContext();
9133
9134 if (context)
9135 {
9136 if (context->getClientVersion() < 3)
9137 {
9138 return gl::error(GL_INVALID_OPERATION);
9139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009140
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009141 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009142 {
9143 return;
9144 }
9145
9146 if (!context->isSampler(sampler))
9147 {
9148 return gl::error(GL_INVALID_OPERATION);
9149 }
9150
9151 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009152 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009153 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009154 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009155 {
9156 return gl::error(GL_OUT_OF_MEMORY);
9157 }
9158}
9159
9160void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9161{
9162 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9163
9164 try
9165 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009166 if (index >= gl::MAX_VERTEX_ATTRIBS)
9167 {
9168 return gl::error(GL_INVALID_VALUE);
9169 }
9170
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009171 gl::Context *context = gl::getNonLostContext();
9172
9173 if (context)
9174 {
9175 if (context->getClientVersion() < 3)
9176 {
9177 return gl::error(GL_INVALID_OPERATION);
9178 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009179
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009180 context->setVertexAttribDivisor(index, divisor);
9181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009182 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009183 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009184 {
9185 return gl::error(GL_OUT_OF_MEMORY);
9186 }
9187}
9188
9189void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9190{
9191 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9192
9193 try
9194 {
9195 gl::Context *context = gl::getNonLostContext();
9196
9197 if (context)
9198 {
9199 if (context->getClientVersion() < 3)
9200 {
9201 return gl::error(GL_INVALID_OPERATION);
9202 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009203
Geoff Langc8058452014-02-03 12:04:11 -05009204 switch (target)
9205 {
9206 case GL_TRANSFORM_FEEDBACK:
9207 {
9208 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9209 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9210 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9211 {
9212 return gl::error(GL_INVALID_OPERATION);
9213 }
9214
9215 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9216 if (context->getTransformFeedback(id) == NULL)
9217 {
9218 return gl::error(GL_INVALID_OPERATION);
9219 }
9220
9221 context->bindTransformFeedback(id);
9222 }
9223 break;
9224
9225 default:
9226 return gl::error(GL_INVALID_ENUM);
9227 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009228 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009229 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009230 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009231 {
9232 return gl::error(GL_OUT_OF_MEMORY);
9233 }
9234}
9235
9236void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9237{
9238 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9239
9240 try
9241 {
9242 gl::Context *context = gl::getNonLostContext();
9243
9244 if (context)
9245 {
9246 if (context->getClientVersion() < 3)
9247 {
9248 return gl::error(GL_INVALID_OPERATION);
9249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009250
Geoff Langc8058452014-02-03 12:04:11 -05009251 for (int i = 0; i < n; i++)
9252 {
9253 context->deleteTransformFeedback(ids[i]);
9254 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009255 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009256 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009257 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009258 {
9259 return gl::error(GL_OUT_OF_MEMORY);
9260 }
9261}
9262
9263void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9264{
9265 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9266
9267 try
9268 {
9269 gl::Context *context = gl::getNonLostContext();
9270
9271 if (context)
9272 {
9273 if (context->getClientVersion() < 3)
9274 {
9275 return gl::error(GL_INVALID_OPERATION);
9276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009277
Geoff Langc8058452014-02-03 12:04:11 -05009278 for (int i = 0; i < n; i++)
9279 {
9280 ids[i] = context->createTransformFeedback();
9281 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009283 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009284 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009285 {
9286 return gl::error(GL_OUT_OF_MEMORY);
9287 }
9288}
9289
9290GLboolean __stdcall glIsTransformFeedback(GLuint id)
9291{
9292 EVENT("(GLuint id = %u)", id);
9293
9294 try
9295 {
9296 gl::Context *context = gl::getNonLostContext();
9297
9298 if (context)
9299 {
9300 if (context->getClientVersion() < 3)
9301 {
9302 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009304
Geoff Langc8058452014-02-03 12:04:11 -05009305 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009306 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009307 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009308 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009309 {
9310 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9311 }
9312
9313 return GL_FALSE;
9314}
9315
9316void __stdcall glPauseTransformFeedback(void)
9317{
9318 EVENT("(void)");
9319
9320 try
9321 {
9322 gl::Context *context = gl::getNonLostContext();
9323
9324 if (context)
9325 {
9326 if (context->getClientVersion() < 3)
9327 {
9328 return gl::error(GL_INVALID_OPERATION);
9329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009330
Geoff Langc8058452014-02-03 12:04:11 -05009331 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9332 ASSERT(transformFeedback != NULL);
9333
9334 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9335 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9336 {
9337 return gl::error(GL_INVALID_OPERATION);
9338 }
9339
9340 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009342 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009343 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009344 {
9345 return gl::error(GL_OUT_OF_MEMORY);
9346 }
9347}
9348
9349void __stdcall glResumeTransformFeedback(void)
9350{
9351 EVENT("(void)");
9352
9353 try
9354 {
9355 gl::Context *context = gl::getNonLostContext();
9356
9357 if (context)
9358 {
9359 if (context->getClientVersion() < 3)
9360 {
9361 return gl::error(GL_INVALID_OPERATION);
9362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009363
Geoff Langc8058452014-02-03 12:04:11 -05009364 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9365 ASSERT(transformFeedback != NULL);
9366
9367 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9368 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9369 {
9370 return gl::error(GL_INVALID_OPERATION);
9371 }
9372
9373 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009375 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009376 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009377 {
9378 return gl::error(GL_OUT_OF_MEMORY);
9379 }
9380}
9381
9382void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9383{
9384 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9385 program, bufSize, length, binaryFormat, binary);
9386
9387 try
9388 {
9389 gl::Context *context = gl::getNonLostContext();
9390
9391 if (context)
9392 {
9393 if (context->getClientVersion() < 3)
9394 {
9395 return gl::error(GL_INVALID_OPERATION);
9396 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009397
Jamie Madill54133512013-06-21 09:33:07 -04009398 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009399 UNIMPLEMENTED();
9400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009401 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009402 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009403 {
9404 return gl::error(GL_OUT_OF_MEMORY);
9405 }
9406}
9407
9408void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9409{
9410 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9411 program, binaryFormat, binary, length);
9412
9413 try
9414 {
9415 gl::Context *context = gl::getNonLostContext();
9416
9417 if (context)
9418 {
9419 if (context->getClientVersion() < 3)
9420 {
9421 return gl::error(GL_INVALID_OPERATION);
9422 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009423
Jamie Madill54133512013-06-21 09:33:07 -04009424 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009425 UNIMPLEMENTED();
9426 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009427 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009428 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009429 {
9430 return gl::error(GL_OUT_OF_MEMORY);
9431 }
9432}
9433
9434void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9435{
9436 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9437 program, pname, value);
9438
9439 try
9440 {
9441 gl::Context *context = gl::getNonLostContext();
9442
9443 if (context)
9444 {
9445 if (context->getClientVersion() < 3)
9446 {
9447 return gl::error(GL_INVALID_OPERATION);
9448 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009449
Jamie Madill54133512013-06-21 09:33:07 -04009450 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009451 UNIMPLEMENTED();
9452 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009453 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009454 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009455 {
9456 return gl::error(GL_OUT_OF_MEMORY);
9457 }
9458}
9459
9460void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9461{
9462 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9463 target, numAttachments, attachments);
9464
9465 try
9466 {
9467 gl::Context *context = gl::getNonLostContext();
9468
9469 if (context)
9470 {
9471 if (context->getClientVersion() < 3)
9472 {
9473 return gl::error(GL_INVALID_OPERATION);
9474 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009475
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009476 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009477 {
9478 return;
9479 }
9480
9481 int maxDimension = context->getMaximumRenderbufferDimension();
9482 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9483 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009484 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009485 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009486 {
9487 return gl::error(GL_OUT_OF_MEMORY);
9488 }
9489}
9490
9491void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9492{
9493 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9494 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9495 target, numAttachments, attachments, x, y, width, height);
9496
9497 try
9498 {
9499 gl::Context *context = gl::getNonLostContext();
9500
9501 if (context)
9502 {
9503 if (context->getClientVersion() < 3)
9504 {
9505 return gl::error(GL_INVALID_OPERATION);
9506 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009507
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009508 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009509 {
9510 return;
9511 }
9512
9513 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009515 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009516 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009517 {
9518 return gl::error(GL_OUT_OF_MEMORY);
9519 }
9520}
9521
9522void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9523{
9524 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9525 target, levels, internalformat, width, height);
9526
9527 try
9528 {
9529 gl::Context *context = gl::getNonLostContext();
9530
9531 if (context)
9532 {
9533 if (context->getClientVersion() < 3)
9534 {
9535 return gl::error(GL_INVALID_OPERATION);
9536 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009537
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009538 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009539 {
9540 return;
9541 }
9542
9543 switch (target)
9544 {
9545 case GL_TEXTURE_2D:
9546 {
9547 gl::Texture2D *texture2d = context->getTexture2D();
9548 texture2d->storage(levels, internalformat, width, height);
9549 }
9550 break;
9551
Geoff Lang01c21d22013-09-24 11:52:16 -04009552 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009553 {
9554 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9555 textureCube->storage(levels, internalformat, width);
9556 }
9557 break;
9558
9559 default:
9560 return gl::error(GL_INVALID_ENUM);
9561 }
9562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009563 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009564 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009565 {
9566 return gl::error(GL_OUT_OF_MEMORY);
9567 }
9568}
9569
9570void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9571{
9572 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9573 "GLsizei height = %d, GLsizei depth = %d)",
9574 target, levels, internalformat, width, height, depth);
9575
9576 try
9577 {
9578 gl::Context *context = gl::getNonLostContext();
9579
9580 if (context)
9581 {
9582 if (context->getClientVersion() < 3)
9583 {
9584 return gl::error(GL_INVALID_OPERATION);
9585 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009586
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009587 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009588 {
9589 return;
9590 }
9591
9592 switch (target)
9593 {
9594 case GL_TEXTURE_3D:
9595 {
9596 gl::Texture3D *texture3d = context->getTexture3D();
9597 texture3d->storage(levels, internalformat, width, height, depth);
9598 }
9599 break;
9600
9601 case GL_TEXTURE_2D_ARRAY:
9602 {
9603 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9604 texture2darray->storage(levels, internalformat, width, height, depth);
9605 }
9606 break;
9607
9608 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009609 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009610 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009611 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009612 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009613 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009614 {
9615 return gl::error(GL_OUT_OF_MEMORY);
9616 }
9617}
9618
9619void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9620{
9621 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9622 "GLint* params = 0x%0.8p)",
9623 target, internalformat, pname, bufSize, params);
9624
9625 try
9626 {
9627 gl::Context *context = gl::getNonLostContext();
9628
9629 if (context)
9630 {
9631 if (context->getClientVersion() < 3)
9632 {
9633 return gl::error(GL_INVALID_OPERATION);
9634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009635
Geoff Langcec35902014-04-16 10:52:36 -04009636 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
9637 if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
Shannon Woods809d2502013-07-08 10:32:18 -04009638 {
9639 return gl::error(GL_INVALID_ENUM);
9640 }
9641
9642 if (target != GL_RENDERBUFFER)
9643 {
9644 return gl::error(GL_INVALID_ENUM);
9645 }
9646
9647 if (bufSize < 0)
9648 {
9649 return gl::error(GL_INVALID_VALUE);
9650 }
9651
9652 switch (pname)
9653 {
9654 case GL_NUM_SAMPLE_COUNTS:
9655 if (bufSize != 0)
9656 *params = context->getNumSampleCounts(internalformat);
9657 break;
9658 case GL_SAMPLES:
9659 context->getSampleCounts(internalformat, bufSize, params);
9660 break;
9661 default:
9662 return gl::error(GL_INVALID_ENUM);
9663 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009664 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009665 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009666 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009667 {
9668 return gl::error(GL_OUT_OF_MEMORY);
9669 }
9670}
9671
9672// Extension functions
9673
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009674void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9675 GLbitfield mask, GLenum filter)
9676{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009677 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009678 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9679 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9680 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9681
9682 try
9683 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009685
9686 if (context)
9687 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009688 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009689 dstX0, dstY0, dstX1, dstY1, mask, filter,
9690 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009691 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009692 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009693 }
9694
Geoff Lang758d5b22013-06-11 11:42:50 -04009695 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9696 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009697 }
9698 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009699 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009702 }
9703}
9704
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009705void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9706 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009707{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009708 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009709 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009710 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009711 target, level, internalformat, width, height, depth, border, format, type, pixels);
9712
9713 try
9714 {
9715 UNIMPLEMENTED(); // FIXME
9716 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009717 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009720 }
9721}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009722
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009723void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9724 GLenum *binaryFormat, void *binary)
9725{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009726 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 +00009727 program, bufSize, length, binaryFormat, binary);
9728
9729 try
9730 {
9731 gl::Context *context = gl::getNonLostContext();
9732
9733 if (context)
9734 {
9735 gl::Program *programObject = context->getProgram(program);
9736
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009737 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009739 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009740 }
9741
9742 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9743
9744 if (!programBinary)
9745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009746 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009747 }
9748
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009749 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009751 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009752 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009753
9754 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009755 }
9756 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009757 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009759 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009760 }
9761}
9762
9763void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9764 const void *binary, GLint length)
9765{
9766 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9767 program, binaryFormat, binary, length);
9768
9769 try
9770 {
9771 gl::Context *context = gl::getNonLostContext();
9772
9773 if (context)
9774 {
9775 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009777 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009778 }
9779
9780 gl::Program *programObject = context->getProgram(program);
9781
9782 if (!programObject)
9783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009784 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009785 }
9786
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009787 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009788 }
9789 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009790 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009792 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009793 }
9794}
9795
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009796void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9797{
9798 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9799
9800 try
9801 {
9802 gl::Context *context = gl::getNonLostContext();
9803
9804 if (context)
9805 {
9806 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9807 {
9808 return gl::error(GL_INVALID_VALUE);
9809 }
9810
9811 if (context->getDrawFramebufferHandle() == 0)
9812 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009813 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009814 {
9815 return gl::error(GL_INVALID_OPERATION);
9816 }
9817
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009818 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009819 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009820 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009821 }
9822 }
9823 else
9824 {
9825 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9826 {
9827 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9828 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9829 {
9830 return gl::error(GL_INVALID_OPERATION);
9831 }
9832 }
9833 }
9834
9835 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9836
9837 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9838 {
9839 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9840 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009841
9842 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9843 {
9844 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9845 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009846 }
9847 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009848 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009849 {
9850 return gl::error(GL_OUT_OF_MEMORY);
9851 }
9852}
9853
Shannon Woodsb3801742014-03-27 14:59:19 -04009854void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9855{
9856 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9857
9858 try
9859 {
9860 gl::Context *context = gl::getNonLostContext();
9861
9862 if (context)
9863 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009864 if (!gl::ValidBufferTarget(context, target))
9865 {
9866 return gl::error(GL_INVALID_ENUM);
9867 }
9868
9869 if (pname != GL_BUFFER_MAP_POINTER)
9870 {
9871 return gl::error(GL_INVALID_ENUM);
9872 }
9873
9874 gl::Buffer *buffer = context->getTargetBuffer(target);
9875
9876 if (!buffer || !buffer->mapped())
9877 {
9878 *params = NULL;
9879 }
9880
9881 *params = buffer->mapPointer();
9882 }
9883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009884 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009885 {
9886 return gl::error(GL_OUT_OF_MEMORY);
9887 }
9888}
9889
9890void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9891{
9892 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9893
9894 try
9895 {
9896 gl::Context *context = gl::getNonLostContext();
9897
9898 if (context)
9899 {
9900 if (!gl::ValidBufferTarget(context, target))
9901 {
9902 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9903 }
9904
9905 gl::Buffer *buffer = context->getTargetBuffer(target);
9906
9907 if (buffer == NULL)
9908 {
9909 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9910 }
9911
9912 if (access != GL_WRITE_ONLY_OES)
9913 {
9914 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9915 }
9916
9917 if (buffer->mapped())
9918 {
9919 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9920 }
9921
9922 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
9923 }
9924 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009925 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009926 {
9927 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
9928 }
9929
9930 return NULL;
9931}
9932
9933GLboolean __stdcall glUnmapBufferOES(GLenum target)
9934{
9935 EVENT("(GLenum target = 0x%X)", target);
9936
9937 try
9938 {
9939 gl::Context *context = gl::getNonLostContext();
9940
9941 if (context)
9942 {
9943 if (!gl::ValidBufferTarget(context, target))
9944 {
9945 return gl::error(GL_INVALID_ENUM, GL_FALSE);
9946 }
9947
9948 gl::Buffer *buffer = context->getTargetBuffer(target);
9949
9950 if (buffer == NULL || !buffer->mapped())
9951 {
9952 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9953 }
9954
9955 // TODO: detect if we had corruption. if so, throw an error and return false.
9956
9957 buffer->unmap();
9958
9959 return GL_TRUE;
9960 }
9961 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009962 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009963 {
9964 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9965 }
9966
9967 return GL_FALSE;
9968}
9969
Shannon Woods916e7692014-03-27 16:58:22 -04009970void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
9971{
9972 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
9973 target, offset, length, access);
9974
9975 try
9976 {
9977 gl::Context *context = gl::getNonLostContext();
9978
9979 if (context)
9980 {
9981 if (!gl::ValidBufferTarget(context, target))
9982 {
9983 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9984 }
9985
9986 if (offset < 0 || length < 0)
9987 {
9988 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
9989 }
9990
9991 gl::Buffer *buffer = context->getTargetBuffer(target);
9992
9993 if (buffer == NULL)
9994 {
9995 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9996 }
9997
9998 // Check for buffer overflow
9999 size_t offsetSize = static_cast<size_t>(offset);
10000 size_t lengthSize = static_cast<size_t>(length);
10001
10002 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10003 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10004 {
10005 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10006 }
10007
10008 // Check for invalid bits in the mask
10009 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10010 GL_MAP_WRITE_BIT |
10011 GL_MAP_INVALIDATE_RANGE_BIT |
10012 GL_MAP_INVALIDATE_BUFFER_BIT |
10013 GL_MAP_FLUSH_EXPLICIT_BIT |
10014 GL_MAP_UNSYNCHRONIZED_BIT;
10015
10016 if (access & ~(allAccessBits))
10017 {
10018 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10019 }
10020
10021 if (length == 0 || buffer->mapped())
10022 {
10023 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10024 }
10025
10026 // Check for invalid bit combinations
10027 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10028 {
10029 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10030 }
10031
10032 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10033 GL_MAP_INVALIDATE_BUFFER_BIT |
10034 GL_MAP_UNSYNCHRONIZED_BIT;
10035
10036 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10037 {
10038 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10039 }
10040
10041 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10042 {
10043 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10044 }
10045
10046 return buffer->mapRange(offset, length, access);
10047 }
10048 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010049 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010050 {
10051 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10052 }
10053
10054 return NULL;
10055}
10056
10057void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10058{
10059 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10060
10061 try
10062 {
10063 gl::Context *context = gl::getNonLostContext();
10064
10065 if (context)
10066 {
10067 if (offset < 0 || length < 0)
10068 {
10069 return gl::error(GL_INVALID_VALUE);
10070 }
10071
10072 if (!gl::ValidBufferTarget(context, target))
10073 {
10074 return gl::error(GL_INVALID_ENUM);
10075 }
10076
10077 gl::Buffer *buffer = context->getTargetBuffer(target);
10078
10079 if (buffer == NULL)
10080 {
10081 return gl::error(GL_INVALID_OPERATION);
10082 }
10083
10084 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10085 {
10086 return gl::error(GL_INVALID_OPERATION);
10087 }
10088
10089 // Check for buffer overflow
10090 size_t offsetSize = static_cast<size_t>(offset);
10091 size_t lengthSize = static_cast<size_t>(length);
10092
10093 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10094 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10095 {
10096 return gl::error(GL_INVALID_VALUE);
10097 }
10098
10099 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10100 }
10101 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010102 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010103 {
10104 return gl::error(GL_OUT_OF_MEMORY);
10105 }
10106}
10107
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010108__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10109{
10110 struct Extension
10111 {
10112 const char *name;
10113 __eglMustCastToProperFunctionPointerType address;
10114 };
10115
10116 static const Extension glExtensions[] =
10117 {
10118 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010119 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010120 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010121 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10122 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10123 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10124 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10125 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10126 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10127 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010128 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010129 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010130 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10131 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10132 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10133 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010134 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10135 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10136 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10137 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10138 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10139 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10140 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010141 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010142 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10143 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10144 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010145 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010146 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10147 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10148 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010149 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10150 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10151 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010152
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010153 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010154 {
10155 if (strcmp(procname, glExtensions[ext].name) == 0)
10156 {
10157 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10158 }
10159 }
10160
10161 return NULL;
10162}
10163
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010164// Non-public functions used by EGL
10165
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010166bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010167{
10168 EVENT("(egl::Surface* surface = 0x%0.8p)",
10169 surface);
10170
10171 try
10172 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010173 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010174
10175 if (context)
10176 {
10177 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010178 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010179
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010180 if (textureObject->isImmutable())
10181 {
10182 return false;
10183 }
10184
Geoff Lang32d508e2014-02-11 09:39:48 -050010185 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010186 }
10187 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010188 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010190 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010191 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010192
10193 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010194}
10195
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010196}