blob: e8c8aa36bb70c3b37ba029081d23164cf5f69472 [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
Geoff Lang646559f2013-08-15 11:08:15 -04002540 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002541 {
Geoff Lang646559f2013-08-15 11:08:15 -04002542 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2543 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2544 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2545 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2546 break;
2547 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2548 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2549 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2550 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2551 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2552 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2553 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2554 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2555 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2556 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002557 {
Geoff Lang646559f2013-08-15 11:08:15 -04002558 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002559 }
Geoff Lang646559f2013-08-15 11:08:15 -04002560 default:
2561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002562 }
Geoff Lang646559f2013-08-15 11:08:15 -04002563
2564 // Determine if the attachment is a valid enum
2565 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002566 {
Geoff Lang646559f2013-08-15 11:08:15 -04002567 case GL_BACK:
2568 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002569 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002570 case GL_STENCIL:
2571 case GL_DEPTH_STENCIL_ATTACHMENT:
2572 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002573 {
Geoff Lang646559f2013-08-15 11:08:15 -04002574 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002575 }
Geoff Lang646559f2013-08-15 11:08:15 -04002576 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002577
Geoff Lang646559f2013-08-15 11:08:15 -04002578 case GL_DEPTH_ATTACHMENT:
2579 case GL_STENCIL_ATTACHMENT:
2580 break;
2581
2582 default:
2583 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2584 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2585 {
2586 return gl::error(GL_INVALID_ENUM);
2587 }
2588 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002589 }
2590
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002591 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2592 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002593 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2594
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002595 GLenum attachmentType;
2596 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002597 GLuint attachmentLevel;
2598 GLuint attachmentLayer;
Jamie Madill3c7fa222014-06-05 13:08:51 -04002599 gl::FramebufferAttachment *attachmentObject;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002600
Jamie Madill3c7fa222014-06-05 13:08:51 -04002601 if (framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002602 {
Jamie Madill3c7fa222014-06-05 13:08:51 -04002603 if (context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002604 {
Geoff Lang646559f2013-08-15 11:08:15 -04002605 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002606 }
2607
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002608 switch (attachment)
2609 {
Geoff Lang646559f2013-08-15 11:08:15 -04002610 case GL_BACK:
2611 attachmentType = framebuffer->getColorbufferType(0);
2612 attachmentHandle = framebuffer->getColorbufferHandle(0);
2613 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2614 attachmentLayer = framebuffer->getColorbufferLayer(0);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002615 attachmentObject = framebuffer->getColorbuffer(0);
Geoff Lang646559f2013-08-15 11:08:15 -04002616 break;
2617 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002618 attachmentType = framebuffer->getDepthbufferType();
2619 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002620 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2621 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002622 attachmentObject = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002623 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002624 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002625 attachmentType = framebuffer->getStencilbufferType();
2626 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002627 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2628 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002629 attachmentObject = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002630 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002631 default:
2632 return gl::error(GL_INVALID_OPERATION);
2633 }
2634 }
2635 else
2636 {
2637 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2638 {
2639 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2640 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2641 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2642 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2643 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002644 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
Geoff Lang646559f2013-08-15 11:08:15 -04002645 }
2646 else
2647 {
2648 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002649 {
Geoff Lang646559f2013-08-15 11:08:15 -04002650 case GL_DEPTH_ATTACHMENT:
2651 attachmentType = framebuffer->getDepthbufferType();
2652 attachmentHandle = framebuffer->getDepthbufferHandle();
2653 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2654 attachmentLayer = framebuffer->getDepthbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002655 attachmentObject = framebuffer->getDepthbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002656 break;
2657 case GL_STENCIL_ATTACHMENT:
2658 attachmentType = framebuffer->getStencilbufferType();
2659 attachmentHandle = framebuffer->getStencilbufferHandle();
2660 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2661 attachmentLayer = framebuffer->getStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002662 attachmentObject = framebuffer->getStencilbuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002663 break;
2664 case GL_DEPTH_STENCIL_ATTACHMENT:
2665 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2666 {
2667 return gl::error(GL_INVALID_OPERATION);
2668 }
2669 attachmentType = framebuffer->getDepthStencilbufferType();
2670 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2671 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2672 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
Jamie Madill3c7fa222014-06-05 13:08:51 -04002673 attachmentObject = framebuffer->getDepthStencilBuffer();
Geoff Lang646559f2013-08-15 11:08:15 -04002674 break;
2675 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002676 return gl::error(GL_INVALID_OPERATION);
2677 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002678 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002679 }
2680
2681 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002682 if (framebufferHandle == 0)
2683 {
2684 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2685 }
2686 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002687 {
2688 attachmentObjectType = attachmentType;
2689 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002690 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002691 {
2692 attachmentObjectType = GL_TEXTURE;
2693 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002694 else
2695 {
2696 UNREACHABLE();
2697 return;
2698 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002699
Geoff Lang646559f2013-08-15 11:08:15 -04002700 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002701 {
Geoff Lang646559f2013-08-15 11:08:15 -04002702 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2703 // is NONE, then querying any other pname will generate INVALID_ENUM.
2704
2705 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2706 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2707 // INVALID_OPERATION for all other pnames
2708
2709 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002710 {
Geoff Lang646559f2013-08-15 11:08:15 -04002711 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2712 *params = attachmentObjectType;
2713 break;
2714
2715 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2716 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002717 {
Geoff Lang646559f2013-08-15 11:08:15 -04002718 return gl::error(GL_INVALID_ENUM);
2719 }
2720 *params = 0;
2721 break;
2722
2723 default:
2724 if (context->getClientVersion() < 3)
2725 {
2726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002727 }
2728 else
2729 {
Geoff Lang646559f2013-08-15 11:08:15 -04002730 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002731 }
2732 }
Geoff Lang646559f2013-08-15 11:08:15 -04002733 }
2734 else
2735 {
2736 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2737 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
Jamie Madill3c7fa222014-06-05 13:08:51 -04002738 ASSERT(attachmentObject != NULL);
Geoff Lang646559f2013-08-15 11:08:15 -04002739
2740 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002741 {
Geoff Lang646559f2013-08-15 11:08:15 -04002742 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2743 *params = attachmentObjectType;
2744 break;
2745
2746 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2747 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2748 {
2749 return gl::error(GL_INVALID_ENUM);
2750 }
2751 *params = attachmentHandle;
2752 break;
2753
2754 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2755 if (attachmentObjectType != GL_TEXTURE)
2756 {
2757 return gl::error(GL_INVALID_ENUM);
2758 }
2759 *params = attachmentLevel;
2760 break;
2761
2762 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2763 if (attachmentObjectType != GL_TEXTURE)
2764 {
2765 return gl::error(GL_INVALID_ENUM);
2766 }
2767 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2768 break;
2769
2770 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002771 *params = attachmentObject->getRedSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002772 break;
2773
2774 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002775 *params = attachmentObject->getGreenSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002776 break;
2777
2778 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002779 *params = attachmentObject->getBlueSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002780 break;
2781
2782 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002783 *params = attachmentObject->getAlphaSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002784 break;
2785
2786 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002787 *params = attachmentObject->getDepthSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002788 break;
2789
2790 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002791 *params = attachmentObject->getStencilSize();
Geoff Lang646559f2013-08-15 11:08:15 -04002792 break;
2793
2794 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2795 if (attachment == GL_DEPTH_STENCIL)
2796 {
2797 gl::error(GL_INVALID_OPERATION);
2798 }
Jamie Madill3c7fa222014-06-05 13:08:51 -04002799 *params = attachmentObject->getComponentType();
Geoff Lang646559f2013-08-15 11:08:15 -04002800 break;
2801
2802 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
Jamie Madill3c7fa222014-06-05 13:08:51 -04002803 *params = attachmentObject->getColorEncoding();
Geoff Lang646559f2013-08-15 11:08:15 -04002804 break;
2805
2806 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2807 if (attachmentObjectType != GL_TEXTURE)
2808 {
2809 return gl::error(GL_INVALID_ENUM);
2810 }
2811 *params = attachmentLayer;
2812 break;
2813
2814 default:
2815 UNREACHABLE();
2816 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002817 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002818 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002819 }
2820 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002821 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824 }
2825}
2826
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002827GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2828{
2829 EVENT("()");
2830
2831 try
2832 {
2833 gl::Context *context = gl::getContext();
2834
2835 if (context)
2836 {
2837 return context->getResetStatus();
2838 }
2839
2840 return GL_NO_ERROR;
2841 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002842 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002843 {
2844 return GL_OUT_OF_MEMORY;
2845 }
2846}
2847
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002848void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2849{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002850 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851
2852 try
2853 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002854 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002855
2856 if (context)
2857 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002858 GLenum nativeType;
2859 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002860
Jamie Madill893ab082014-05-16 16:56:10 -04002861 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2862 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002863 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002864 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002865
2866 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002867 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002868 context->getIntegerv(pname, params);
2869 }
Jamie Madill55856b12014-01-02 13:59:50 -05002870 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002871 {
Jamie Madill55856b12014-01-02 13:59:50 -05002872 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873 }
2874 }
2875 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002876 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002879 }
2880}
2881
2882void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002884 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002885
2886 try
2887 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889
2890 if (context)
2891 {
2892 gl::Program *programObject = context->getProgram(program);
2893
2894 if (!programObject)
2895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897 }
2898
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002899 if (context->getClientVersion() < 3)
2900 {
2901 switch (pname)
2902 {
2903 case GL_ACTIVE_UNIFORM_BLOCKS:
2904 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002905 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2906 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2907 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002908 return gl::error(GL_INVALID_ENUM);
2909 }
2910 }
2911
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912 switch (pname)
2913 {
2914 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002915 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002916 return;
2917 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002918 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919 return;
2920 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002921 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002922 return;
2923 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002924 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002925 return;
2926 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002927 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002928 return;
2929 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002930 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002931 return;
2932 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002933 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 return;
2935 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002936 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937 return;
2938 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002939 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002941 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00002942 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00002943 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002944 case GL_ACTIVE_UNIFORM_BLOCKS:
2945 *params = programObject->getActiveUniformBlockCount();
2946 return;
2947 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
2948 *params = programObject->getActiveUniformBlockMaxLength();
2949 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05002950 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
2951 *params = programObject->getTransformFeedbackBufferMode();
2952 break;
2953 case GL_TRANSFORM_FEEDBACK_VARYINGS:
2954 *params = programObject->getTransformFeedbackVaryingCount();
2955 break;
2956 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
2957 *params = programObject->getTransformFeedbackVaryingMaxLength();
2958 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002960 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961 }
2962 }
2963 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002964 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 }
2968}
2969
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002970void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002972 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 +00002973 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002974
2975 try
2976 {
2977 if (bufsize < 0)
2978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002979 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002980 }
2981
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002982 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002983
2984 if (context)
2985 {
2986 gl::Program *programObject = context->getProgram(program);
2987
2988 if (!programObject)
2989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002990 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002991 }
2992
2993 programObject->getInfoLog(bufsize, length, infolog);
2994 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002995 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002996 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002998 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 }
3000}
3001
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003002void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3003{
3004 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3005
3006 try
3007 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003008 gl::Context *context = gl::getNonLostContext();
3009
3010 if (context)
3011 {
Geoff Lang37dde692014-01-31 16:34:54 -05003012 if (!ValidQueryType(context, target))
3013 {
3014 return gl::error(GL_INVALID_ENUM);
3015 }
3016
3017 switch (pname)
3018 {
3019 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003020 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003021 break;
3022
3023 default:
3024 return gl::error(GL_INVALID_ENUM);
3025 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003026 }
3027 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003028 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003030 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003031 }
3032}
3033
3034void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3035{
3036 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3037
3038 try
3039 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003040 gl::Context *context = gl::getNonLostContext();
3041
3042 if (context)
3043 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003044 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3045
3046 if (!queryObject)
3047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003048 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003049 }
3050
Jamie Madill45c785d2014-05-13 14:09:34 -04003051 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003053 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003054 }
3055
3056 switch(pname)
3057 {
3058 case GL_QUERY_RESULT_EXT:
3059 params[0] = queryObject->getResult();
3060 break;
3061 case GL_QUERY_RESULT_AVAILABLE_EXT:
3062 params[0] = queryObject->isResultAvailable();
3063 break;
3064 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003066 }
3067 }
3068 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003069 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003072 }
3073}
3074
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003075void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003077 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 +00003078
3079 try
3080 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003082
3083 if (context)
3084 {
3085 if (target != GL_RENDERBUFFER)
3086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003087 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003088 }
3089
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003090 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003092 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003093 }
3094
Jamie Madill3c7fa222014-06-05 13:08:51 -04003095 gl::FramebufferAttachment *attachment = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003096
3097 switch (pname)
3098 {
Jamie Madill3c7fa222014-06-05 13:08:51 -04003099 case GL_RENDERBUFFER_WIDTH: *params = attachment->getWidth(); break;
3100 case GL_RENDERBUFFER_HEIGHT: *params = attachment->getHeight(); break;
3101 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = attachment->getInternalFormat(); break;
3102 case GL_RENDERBUFFER_RED_SIZE: *params = attachment->getRedSize(); break;
3103 case GL_RENDERBUFFER_GREEN_SIZE: *params = attachment->getGreenSize(); break;
3104 case GL_RENDERBUFFER_BLUE_SIZE: *params = attachment->getBlueSize(); break;
3105 case GL_RENDERBUFFER_ALPHA_SIZE: *params = attachment->getAlphaSize(); break;
3106 case GL_RENDERBUFFER_DEPTH_SIZE: *params = attachment->getDepthSize(); break;
3107 case GL_RENDERBUFFER_STENCIL_SIZE: *params = attachment->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003108 case GL_RENDERBUFFER_SAMPLES_ANGLE:
Geoff Langcec35902014-04-16 10:52:36 -04003109 if (!context->getCaps().extensions.framebufferMultisample)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003111 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003112 }
Geoff Langcec35902014-04-16 10:52:36 -04003113 *params = attachment->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003114 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003116 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003117 }
3118 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003119 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003120 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003122 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 }
3124}
3125
3126void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003128 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003129
3130 try
3131 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003133
3134 if (context)
3135 {
3136 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003137
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003138 if (!shaderObject)
3139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003140 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003141 }
3142
3143 switch (pname)
3144 {
3145 case GL_SHADER_TYPE:
3146 *params = shaderObject->getType();
3147 return;
3148 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003149 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003150 return;
3151 case GL_COMPILE_STATUS:
3152 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3153 return;
3154 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003155 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003156 return;
3157 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003158 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003159 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003160 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3161 *params = shaderObject->getTranslatedSourceLength();
3162 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003163 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003164 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003165 }
3166 }
3167 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003168 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003170 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003171 }
3172}
3173
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003174void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003176 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 +00003177 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178
3179 try
3180 {
3181 if (bufsize < 0)
3182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003183 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003184 }
3185
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003186 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003187
3188 if (context)
3189 {
3190 gl::Shader *shaderObject = context->getShader(shader);
3191
3192 if (!shaderObject)
3193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003194 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003195 }
3196
3197 shaderObject->getInfoLog(bufsize, length, infolog);
3198 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003199 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003200 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003202 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003203 }
3204}
3205
3206void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003208 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 +00003209 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003210
3211 try
3212 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003213 switch (shadertype)
3214 {
3215 case GL_VERTEX_SHADER:
3216 case GL_FRAGMENT_SHADER:
3217 break;
3218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003220 }
3221
3222 switch (precisiontype)
3223 {
3224 case GL_LOW_FLOAT:
3225 case GL_MEDIUM_FLOAT:
3226 case GL_HIGH_FLOAT:
3227 // Assume IEEE 754 precision
3228 range[0] = 127;
3229 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003230 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003231 break;
3232 case GL_LOW_INT:
3233 case GL_MEDIUM_INT:
3234 case GL_HIGH_INT:
3235 // Some (most) hardware only supports single-precision floating-point numbers,
3236 // which can accurately represent integers up to +/-16777216
3237 range[0] = 24;
3238 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003239 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003240 break;
3241 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003243 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003244 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003245 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003247 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003248 }
3249}
3250
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003251void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003253 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 +00003254 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255
3256 try
3257 {
3258 if (bufsize < 0)
3259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003260 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261 }
3262
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003263 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003264
3265 if (context)
3266 {
3267 gl::Shader *shaderObject = context->getShader(shader);
3268
3269 if (!shaderObject)
3270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003271 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003272 }
3273
3274 shaderObject->getSource(bufsize, length, source);
3275 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003277 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 }
3281}
3282
zmo@google.coma574f782011-10-03 21:45:23 +00003283void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3284{
3285 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3286 shader, bufsize, length, source);
3287
3288 try
3289 {
3290 if (bufsize < 0)
3291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003292 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003293 }
3294
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003295 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003296
3297 if (context)
3298 {
3299 gl::Shader *shaderObject = context->getShader(shader);
3300
3301 if (!shaderObject)
3302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003303 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003304 }
3305
3306 shaderObject->getTranslatedSource(bufsize, length, source);
3307 }
3308 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003309 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003311 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003312 }
3313}
3314
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315const GLubyte* __stdcall glGetString(GLenum name)
3316{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003317 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318
3319 try
3320 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003322
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003323 switch (name)
3324 {
3325 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003326 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003327 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003328 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003330 if (context->getClientVersion() == 2)
3331 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003332 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003333 }
3334 else
3335 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003336 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003337 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003338 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003339 if (context->getClientVersion() == 2)
3340 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003341 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003342 }
3343 else
3344 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003345 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003346 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 case GL_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04003348 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003350 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
3352 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003353 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003355 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357}
3358
3359void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003361 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 +00003362
3363 try
3364 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003366
3367 if (context)
3368 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003369 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003370
Jamie Madillfb8a8302013-07-03 14:24:12 -04003371 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003373 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003374 }
3375
3376 switch (pname)
3377 {
3378 case GL_TEXTURE_MAG_FILTER:
3379 *params = (GLfloat)texture->getMagFilter();
3380 break;
3381 case GL_TEXTURE_MIN_FILTER:
3382 *params = (GLfloat)texture->getMinFilter();
3383 break;
3384 case GL_TEXTURE_WRAP_S:
3385 *params = (GLfloat)texture->getWrapS();
3386 break;
3387 case GL_TEXTURE_WRAP_T:
3388 *params = (GLfloat)texture->getWrapT();
3389 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003390 case GL_TEXTURE_WRAP_R:
3391 if (context->getClientVersion() < 3)
3392 {
3393 return gl::error(GL_INVALID_ENUM);
3394 }
3395 *params = (GLfloat)texture->getWrapR();
3396 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003397 case GL_TEXTURE_IMMUTABLE_FORMAT:
3398 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003399 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3400 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003401 case GL_TEXTURE_IMMUTABLE_LEVELS:
3402 if (context->getClientVersion() < 3)
3403 {
3404 return gl::error(GL_INVALID_ENUM);
3405 }
Jamie Madill51a94372013-10-24 17:49:43 -04003406 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003407 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003408 case GL_TEXTURE_USAGE_ANGLE:
3409 *params = (GLfloat)texture->getUsage();
3410 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003411 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003412 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003414 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003415 }
3416 *params = (GLfloat)texture->getMaxAnisotropy();
3417 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003418 case GL_TEXTURE_SWIZZLE_R:
3419 if (context->getClientVersion() < 3)
3420 {
3421 return gl::error(GL_INVALID_ENUM);
3422 }
3423 *params = (GLfloat)texture->getSwizzleRed();
3424 break;
3425 case GL_TEXTURE_SWIZZLE_G:
3426 if (context->getClientVersion() < 3)
3427 {
3428 return gl::error(GL_INVALID_ENUM);
3429 }
3430 *params = (GLfloat)texture->getSwizzleGreen();
3431 break;
3432 case GL_TEXTURE_SWIZZLE_B:
3433 if (context->getClientVersion() < 3)
3434 {
3435 return gl::error(GL_INVALID_ENUM);
3436 }
3437 *params = (GLfloat)texture->getSwizzleBlue();
3438 break;
3439 case GL_TEXTURE_SWIZZLE_A:
3440 if (context->getClientVersion() < 3)
3441 {
3442 return gl::error(GL_INVALID_ENUM);
3443 }
3444 *params = (GLfloat)texture->getSwizzleAlpha();
3445 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003446 case GL_TEXTURE_BASE_LEVEL:
3447 if (context->getClientVersion() < 3)
3448 {
3449 return gl::error(GL_INVALID_ENUM);
3450 }
3451 *params = (GLfloat)texture->getBaseLevel();
3452 break;
3453 case GL_TEXTURE_MAX_LEVEL:
3454 if (context->getClientVersion() < 3)
3455 {
3456 return gl::error(GL_INVALID_ENUM);
3457 }
3458 *params = (GLfloat)texture->getMaxLevel();
3459 break;
3460 case GL_TEXTURE_MIN_LOD:
3461 if (context->getClientVersion() < 3)
3462 {
3463 return gl::error(GL_INVALID_ENUM);
3464 }
3465 *params = texture->getMinLod();
3466 break;
3467 case GL_TEXTURE_MAX_LOD:
3468 if (context->getClientVersion() < 3)
3469 {
3470 return gl::error(GL_INVALID_ENUM);
3471 }
3472 *params = texture->getMaxLod();
3473 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003474 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003475 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003476 }
3477 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003479 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003481 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003482 }
3483}
3484
3485void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3486{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003487 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 +00003488
3489 try
3490 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003491 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003492
3493 if (context)
3494 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003495 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003496
Jamie Madillfb8a8302013-07-03 14:24:12 -04003497 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003499 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003500 }
3501
3502 switch (pname)
3503 {
3504 case GL_TEXTURE_MAG_FILTER:
3505 *params = texture->getMagFilter();
3506 break;
3507 case GL_TEXTURE_MIN_FILTER:
3508 *params = texture->getMinFilter();
3509 break;
3510 case GL_TEXTURE_WRAP_S:
3511 *params = texture->getWrapS();
3512 break;
3513 case GL_TEXTURE_WRAP_T:
3514 *params = texture->getWrapT();
3515 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003516 case GL_TEXTURE_WRAP_R:
3517 if (context->getClientVersion() < 3)
3518 {
3519 return gl::error(GL_INVALID_ENUM);
3520 }
3521 *params = texture->getWrapR();
3522 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003523 case GL_TEXTURE_IMMUTABLE_FORMAT:
3524 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003525 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3526 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003527 case GL_TEXTURE_IMMUTABLE_LEVELS:
3528 if (context->getClientVersion() < 3)
3529 {
3530 return gl::error(GL_INVALID_ENUM);
3531 }
Jamie Madill51a94372013-10-24 17:49:43 -04003532 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003533 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003534 case GL_TEXTURE_USAGE_ANGLE:
3535 *params = texture->getUsage();
3536 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003537 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langcec35902014-04-16 10:52:36 -04003538 if (!context->getCaps().extensions.textureFilterAnisotropic)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003541 }
3542 *params = (GLint)texture->getMaxAnisotropy();
3543 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003544 case GL_TEXTURE_SWIZZLE_R:
3545 if (context->getClientVersion() < 3)
3546 {
3547 return gl::error(GL_INVALID_ENUM);
3548 }
3549 *params = texture->getSwizzleRed();
3550 break;
3551 case GL_TEXTURE_SWIZZLE_G:
3552 if (context->getClientVersion() < 3)
3553 {
3554 return gl::error(GL_INVALID_ENUM);
3555 }
3556 *params = texture->getSwizzleGreen();
3557 break;
3558 case GL_TEXTURE_SWIZZLE_B:
3559 if (context->getClientVersion() < 3)
3560 {
3561 return gl::error(GL_INVALID_ENUM);
3562 }
3563 *params = texture->getSwizzleBlue();
3564 break;
3565 case GL_TEXTURE_SWIZZLE_A:
3566 if (context->getClientVersion() < 3)
3567 {
3568 return gl::error(GL_INVALID_ENUM);
3569 }
3570 *params = texture->getSwizzleAlpha();
3571 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003572 case GL_TEXTURE_BASE_LEVEL:
3573 if (context->getClientVersion() < 3)
3574 {
3575 return gl::error(GL_INVALID_ENUM);
3576 }
3577 *params = texture->getBaseLevel();
3578 break;
3579 case GL_TEXTURE_MAX_LEVEL:
3580 if (context->getClientVersion() < 3)
3581 {
3582 return gl::error(GL_INVALID_ENUM);
3583 }
3584 *params = texture->getMaxLevel();
3585 break;
3586 case GL_TEXTURE_MIN_LOD:
3587 if (context->getClientVersion() < 3)
3588 {
3589 return gl::error(GL_INVALID_ENUM);
3590 }
3591 *params = (GLint)texture->getMinLod();
3592 break;
3593 case GL_TEXTURE_MAX_LOD:
3594 if (context->getClientVersion() < 3)
3595 {
3596 return gl::error(GL_INVALID_ENUM);
3597 }
3598 *params = (GLint)texture->getMaxLod();
3599 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003600 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003601 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003602 }
3603 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003605 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003607 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608 }
3609}
3610
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003611void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3612{
3613 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3614 program, location, bufSize, params);
3615
3616 try
3617 {
3618 if (bufSize < 0)
3619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003620 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003621 }
3622
3623 gl::Context *context = gl::getNonLostContext();
3624
3625 if (context)
3626 {
3627 if (program == 0)
3628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003629 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003630 }
3631
3632 gl::Program *programObject = context->getProgram(program);
3633
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003634 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003636 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003637 }
3638
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003639 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3640 if (!programBinary)
3641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003642 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003643 }
3644
3645 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003647 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003648 }
3649 }
3650 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003651 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003654 }
3655}
3656
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003657void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003659 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003660
3661 try
3662 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003663 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003664
3665 if (context)
3666 {
3667 if (program == 0)
3668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003669 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003670 }
3671
3672 gl::Program *programObject = context->getProgram(program);
3673
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003674 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003677 }
3678
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003679 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3680 if (!programBinary)
3681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003682 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003683 }
3684
3685 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003687 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003688 }
3689 }
3690 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003691 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003694 }
3695}
3696
3697void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3698{
3699 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3700 program, location, bufSize, params);
3701
3702 try
3703 {
3704 if (bufSize < 0)
3705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003707 }
3708
3709 gl::Context *context = gl::getNonLostContext();
3710
3711 if (context)
3712 {
3713 if (program == 0)
3714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003716 }
3717
3718 gl::Program *programObject = context->getProgram(program);
3719
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003720 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003722 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003723 }
3724
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003725 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3726 if (!programBinary)
3727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003729 }
3730
3731 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003734 }
3735 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003736 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003737 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003740 }
3741}
3742
3743void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003745 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003746
3747 try
3748 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003750
3751 if (context)
3752 {
3753 if (program == 0)
3754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003756 }
3757
3758 gl::Program *programObject = context->getProgram(program);
3759
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003760 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003763 }
3764
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003765 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3766 if (!programBinary)
3767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003768 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003769 }
3770
3771 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003774 }
3775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003776 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003777 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003780 }
3781}
3782
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003783int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003785 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786
3787 try
3788 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003790
3791 if (strstr(name, "gl_") == name)
3792 {
3793 return -1;
3794 }
3795
3796 if (context)
3797 {
3798 gl::Program *programObject = context->getProgram(program);
3799
3800 if (!programObject)
3801 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003802 if (context->getShader(program))
3803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003804 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003805 }
3806 else
3807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003808 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003809 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003810 }
3811
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003812 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003813 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003815 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816 }
3817
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003818 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003819 }
3820 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003821 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003823 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003824 }
3825
3826 return -1;
3827}
3828
3829void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3830{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003831 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832
3833 try
3834 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003836
daniel@transgaming.come0078962010-04-15 20:45:08 +00003837 if (context)
3838 {
3839 if (index >= gl::MAX_VERTEX_ATTRIBS)
3840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003841 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003842 }
3843
daniel@transgaming.com83921382011-01-08 05:46:00 +00003844 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003845
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003846 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003847 {
Jamie Madillaff71502013-07-02 11:57:05 -04003848 return;
3849 }
3850
3851 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3852 {
3853 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3854 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003855 {
Jamie Madillaff71502013-07-02 11:57:05 -04003856 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003857 }
Jamie Madillaff71502013-07-02 11:57:05 -04003858 }
3859 else
3860 {
3861 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003862 }
3863 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003864 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003865 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003867 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868 }
3869}
3870
3871void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003873 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874
3875 try
3876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003878
daniel@transgaming.come0078962010-04-15 20:45:08 +00003879 if (context)
3880 {
3881 if (index >= gl::MAX_VERTEX_ATTRIBS)
3882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003884 }
3885
daniel@transgaming.com83921382011-01-08 05:46:00 +00003886 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003887
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003888 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003889 {
Jamie Madillaff71502013-07-02 11:57:05 -04003890 return;
3891 }
3892
3893 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3894 {
3895 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3896 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003897 {
Jamie Madillaff71502013-07-02 11:57:05 -04003898 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003899 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003900 }
Jamie Madillaff71502013-07-02 11:57:05 -04003901 }
3902 else
3903 {
3904 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003905 }
3906 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003907 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003908 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003911 }
3912}
3913
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003914void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003916 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003917
3918 try
3919 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921
daniel@transgaming.come0078962010-04-15 20:45:08 +00003922 if (context)
3923 {
3924 if (index >= gl::MAX_VERTEX_ATTRIBS)
3925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003927 }
3928
3929 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003932 }
3933
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003934 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003935 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003937 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003939 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940 }
3941}
3942
3943void __stdcall glHint(GLenum target, GLenum mode)
3944{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003945 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003946
3947 try
3948 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003949 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003950 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003951 case GL_FASTEST:
3952 case GL_NICEST:
3953 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003954 break;
3955 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003956 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003957 }
3958
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003959 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003960 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003961 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00003962 case GL_GENERATE_MIPMAP_HINT:
3963 if (context) context->setGenerateMipmapHint(mode);
3964 break;
3965 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3966 if (context) context->setFragmentShaderDerivativeHint(mode);
3967 break;
3968 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003969 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003970 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003971 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003972 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003975 }
3976}
3977
3978GLboolean __stdcall glIsBuffer(GLuint buffer)
3979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003980 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981
3982 try
3983 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003984 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985
3986 if (context && buffer)
3987 {
3988 gl::Buffer *bufferObject = context->getBuffer(buffer);
3989
3990 if (bufferObject)
3991 {
3992 return GL_TRUE;
3993 }
3994 }
3995 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003996 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003998 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003999 }
4000
4001 return GL_FALSE;
4002}
4003
4004GLboolean __stdcall glIsEnabled(GLenum cap)
4005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004006 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007
4008 try
4009 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004010 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004011
4012 if (context)
4013 {
Geoff Lang0550d032014-01-30 11:29:07 -05004014 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004016 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017 }
Geoff Lang0550d032014-01-30 11:29:07 -05004018
4019 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020 }
4021 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004022 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004024 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004025 }
4026
4027 return false;
4028}
4029
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004030GLboolean __stdcall glIsFenceNV(GLuint fence)
4031{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004032 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004033
4034 try
4035 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004036 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004037
4038 if (context)
4039 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004040 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004041
4042 if (fenceObject == NULL)
4043 {
4044 return GL_FALSE;
4045 }
4046
4047 return fenceObject->isFence();
4048 }
4049 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004050 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004052 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004053 }
4054
4055 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004056}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004057
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004058GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4059{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004060 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061
4062 try
4063 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004064 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065
4066 if (context && framebuffer)
4067 {
4068 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4069
4070 if (framebufferObject)
4071 {
4072 return GL_TRUE;
4073 }
4074 }
4075 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004076 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004078 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004079 }
4080
4081 return GL_FALSE;
4082}
4083
4084GLboolean __stdcall glIsProgram(GLuint program)
4085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004086 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004087
4088 try
4089 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004091
4092 if (context && program)
4093 {
4094 gl::Program *programObject = context->getProgram(program);
4095
4096 if (programObject)
4097 {
4098 return GL_TRUE;
4099 }
4100 }
4101 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004102 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105 }
4106
4107 return GL_FALSE;
4108}
4109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004110GLboolean __stdcall glIsQueryEXT(GLuint id)
4111{
4112 EVENT("(GLuint id = %d)", id);
4113
4114 try
4115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004116 gl::Context *context = gl::getNonLostContext();
4117
4118 if (context)
4119 {
Geoff Lang37dde692014-01-31 16:34:54 -05004120 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004121 }
4122 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004123 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004126 }
4127
4128 return GL_FALSE;
4129}
4130
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004131GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4132{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004133 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134
4135 try
4136 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004137 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138
4139 if (context && renderbuffer)
4140 {
Jamie Madill3c7fa222014-06-05 13:08:51 -04004141 gl::FramebufferAttachment *renderbufferObject = context->getRenderbuffer(renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004142
4143 if (renderbufferObject)
4144 {
4145 return GL_TRUE;
4146 }
4147 }
4148 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004149 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004151 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004152 }
4153
4154 return GL_FALSE;
4155}
4156
4157GLboolean __stdcall glIsShader(GLuint shader)
4158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004159 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004160
4161 try
4162 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164
4165 if (context && shader)
4166 {
4167 gl::Shader *shaderObject = context->getShader(shader);
4168
4169 if (shaderObject)
4170 {
4171 return GL_TRUE;
4172 }
4173 }
4174 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004175 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004177 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004178 }
4179
4180 return GL_FALSE;
4181}
4182
4183GLboolean __stdcall glIsTexture(GLuint texture)
4184{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004185 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004186
4187 try
4188 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004190
4191 if (context && texture)
4192 {
4193 gl::Texture *textureObject = context->getTexture(texture);
4194
4195 if (textureObject)
4196 {
4197 return GL_TRUE;
4198 }
4199 }
4200 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004201 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004203 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 }
4205
4206 return GL_FALSE;
4207}
4208
4209void __stdcall glLineWidth(GLfloat width)
4210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004211 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 try
4214 {
4215 if (width <= 0.0f)
4216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004217 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004218 }
4219
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004221
4222 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004224 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004225 }
4226 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004227 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230 }
4231}
4232
4233void __stdcall glLinkProgram(GLuint program)
4234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004235 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004236
4237 try
4238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004239 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004240
4241 if (context)
4242 {
4243 gl::Program *programObject = context->getProgram(program);
4244
4245 if (!programObject)
4246 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004247 if (context->getShader(program))
4248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004249 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004250 }
4251 else
4252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004253 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004254 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004255 }
4256
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004257 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258 }
4259 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004260 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263 }
4264}
4265
4266void __stdcall glPixelStorei(GLenum pname, GLint param)
4267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004268 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269
4270 try
4271 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004273
4274 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004276 switch (pname)
4277 {
4278 case GL_UNPACK_ALIGNMENT:
4279 if (param != 1 && param != 2 && param != 4 && param != 8)
4280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004282 }
4283
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004284 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004285 break;
4286
4287 case GL_PACK_ALIGNMENT:
4288 if (param != 1 && param != 2 && param != 4 && param != 8)
4289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004291 }
4292
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004293 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004294 break;
4295
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004296 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4297 context->setPackReverseRowOrder(param != 0);
4298 break;
4299
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004300 case GL_UNPACK_IMAGE_HEIGHT:
4301 case GL_UNPACK_SKIP_IMAGES:
4302 case GL_UNPACK_ROW_LENGTH:
4303 case GL_UNPACK_SKIP_ROWS:
4304 case GL_UNPACK_SKIP_PIXELS:
4305 case GL_PACK_ROW_LENGTH:
4306 case GL_PACK_SKIP_ROWS:
4307 case GL_PACK_SKIP_PIXELS:
4308 if (context->getClientVersion() < 3)
4309 {
4310 return gl::error(GL_INVALID_ENUM);
4311 }
4312 UNIMPLEMENTED();
4313 break;
4314
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004315 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004316 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004317 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318 }
4319 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004320 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004322 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323 }
4324}
4325
4326void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004328 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004329
4330 try
4331 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004332 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004333
4334 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004335 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004336 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337 }
4338 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004339 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004341 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 }
4343}
4344
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004345void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4346 GLenum format, GLenum type, GLsizei bufSize,
4347 GLvoid *data)
4348{
4349 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4350 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4351 x, y, width, height, format, type, bufSize, data);
4352
4353 try
4354 {
4355 if (width < 0 || height < 0 || bufSize < 0)
4356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004358 }
4359
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004360 gl::Context *context = gl::getNonLostContext();
4361
4362 if (context)
4363 {
Jamie Madill26e91952014-03-05 15:01:27 -05004364 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4365 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004366 {
Jamie Madill26e91952014-03-05 15:01:27 -05004367 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004368 }
4369
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004370 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4371 }
4372 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004373 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004375 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004376 }
4377}
4378
4379void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4380 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004382 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004383 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004384 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385
4386 try
4387 {
4388 if (width < 0 || height < 0)
4389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004391 }
4392
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004393 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394
4395 if (context)
4396 {
Jamie Madill26e91952014-03-05 15:01:27 -05004397 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4398 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004399 {
Jamie Madill26e91952014-03-05 15:01:27 -05004400 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004401 }
4402
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004403 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404 }
4405 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004406 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004409 }
4410}
4411
4412void __stdcall glReleaseShaderCompiler(void)
4413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004414 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415
4416 try
4417 {
4418 gl::Shader::releaseCompiler();
4419 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004420 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004422 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423 }
4424}
4425
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004426void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004428 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 +00004429 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430
4431 try
4432 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004433 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004434
4435 if (context)
4436 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004437 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004438 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004439 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004440 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004442
4443 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444 }
4445 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004446 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004449 }
4450}
4451
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004452void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4453{
4454 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4455}
4456
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004457void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4458{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004459 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004460
4461 try
4462 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004463 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004464
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004465 if (context)
4466 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004467 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004470 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004472 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473 }
4474}
4475
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004476void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004478 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004479
4480 try
4481 {
4482 if (condition != GL_ALL_COMPLETED_NV)
4483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004484 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004485 }
4486
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004487 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004488
4489 if (context)
4490 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004491 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004492
4493 if (fenceObject == NULL)
4494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004495 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004496 }
4497
4498 fenceObject->setFence(condition);
4499 }
4500 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004501 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004503 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004504 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004505}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004506
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4508{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004509 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 +00004510
4511 try
4512 {
4513 if (width < 0 || height < 0)
4514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004515 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
4517
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004518 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004519
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004520 if (context)
4521 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004522 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004523 }
4524 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004525 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 }
4529}
4530
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004531void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004533 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004534 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004535 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004536
4537 try
4538 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004539 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004541 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004542 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004544 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546}
4547
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004548void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004549{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004550 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 +00004551 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004552
4553 try
4554 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004555 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004558 }
4559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561
4562 if (context)
4563 {
4564 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004565
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566 if (!shaderObject)
4567 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004568 if (context->getProgram(shader))
4569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004570 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004571 }
4572 else
4573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004574 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004575 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576 }
4577
4578 shaderObject->setSource(count, string, length);
4579 }
4580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004581 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004583 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584 }
4585}
4586
4587void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4588{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004589 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590}
4591
4592void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4593{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004594 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 +00004595
4596 try
4597 {
4598 switch (face)
4599 {
4600 case GL_FRONT:
4601 case GL_BACK:
4602 case GL_FRONT_AND_BACK:
4603 break;
4604 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004605 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606 }
4607
4608 switch (func)
4609 {
4610 case GL_NEVER:
4611 case GL_ALWAYS:
4612 case GL_LESS:
4613 case GL_LEQUAL:
4614 case GL_EQUAL:
4615 case GL_GEQUAL:
4616 case GL_GREATER:
4617 case GL_NOTEQUAL:
4618 break;
4619 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004621 }
4622
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624
4625 if (context)
4626 {
4627 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4628 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004629 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630 }
4631
4632 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4633 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004634 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635 }
4636 }
4637 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004638 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004641 }
4642}
4643
4644void __stdcall glStencilMask(GLuint mask)
4645{
4646 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4647}
4648
4649void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004651 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652
4653 try
4654 {
4655 switch (face)
4656 {
4657 case GL_FRONT:
4658 case GL_BACK:
4659 case GL_FRONT_AND_BACK:
4660 break;
4661 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004663 }
4664
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004665 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004666
4667 if (context)
4668 {
4669 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4670 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004671 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672 }
4673
4674 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4675 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004676 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 }
4678 }
4679 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004680 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004682 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683 }
4684}
4685
4686void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4687{
4688 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4689}
4690
4691void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004693 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 +00004694 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004695
4696 try
4697 {
4698 switch (face)
4699 {
4700 case GL_FRONT:
4701 case GL_BACK:
4702 case GL_FRONT_AND_BACK:
4703 break;
4704 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 }
4707
4708 switch (fail)
4709 {
4710 case GL_ZERO:
4711 case GL_KEEP:
4712 case GL_REPLACE:
4713 case GL_INCR:
4714 case GL_DECR:
4715 case GL_INVERT:
4716 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004717 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004718 break;
4719 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004720 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004721 }
4722
4723 switch (zfail)
4724 {
4725 case GL_ZERO:
4726 case GL_KEEP:
4727 case GL_REPLACE:
4728 case GL_INCR:
4729 case GL_DECR:
4730 case GL_INVERT:
4731 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004732 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004733 break;
4734 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004735 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004736 }
4737
4738 switch (zpass)
4739 {
4740 case GL_ZERO:
4741 case GL_KEEP:
4742 case GL_REPLACE:
4743 case GL_INCR:
4744 case GL_DECR:
4745 case GL_INVERT:
4746 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004747 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748 break;
4749 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004750 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751 }
4752
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004753 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754
4755 if (context)
4756 {
4757 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4758 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004759 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760 }
4761
4762 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4763 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004764 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765 }
4766 }
4767 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004768 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004770 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004771 }
4772}
4773
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004774GLboolean __stdcall glTestFenceNV(GLuint fence)
4775{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004776 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004777
4778 try
4779 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004780 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004781
4782 if (context)
4783 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004784 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004785
4786 if (fenceObject == NULL)
4787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004789 }
4790
Jamie Madillfb9a7402013-07-26 11:55:01 -04004791 if (fenceObject->isFence() != GL_TRUE)
4792 {
4793 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4794 }
4795
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004796 return fenceObject->testFence();
4797 }
4798 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004799 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004801 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004802 }
4803
4804 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004805}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004806
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004807void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4808 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004809{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004810 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004811 "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 +00004812 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813
4814 try
4815 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004816 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817
4818 if (context)
4819 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004820 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004821 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004822 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004823 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004824 return;
4825 }
4826
4827 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004828 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004829 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004830 {
4831 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004832 }
4833
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004834 switch (target)
4835 {
4836 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004837 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004838 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004839 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004840 }
4841 break;
4842 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004843 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004844 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004845 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004847 break;
4848 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4849 {
4850 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004851 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004852 }
4853 break;
4854 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4855 {
4856 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004857 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004858 }
4859 break;
4860 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4861 {
4862 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004863 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004864 }
4865 break;
4866 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4867 {
4868 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004869 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004870 }
4871 break;
4872 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4873 {
4874 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004875 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004876 }
4877 break;
4878 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879 }
4880 }
4881 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004882 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 }
4886}
4887
4888void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4889{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004890 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4891
4892 try
4893 {
4894 gl::Context *context = gl::getNonLostContext();
4895
4896 if (context)
4897 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004898 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004899 {
4900 return;
4901 }
4902
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004903 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004904
Jamie Madillfb8a8302013-07-03 14:24:12 -04004905 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004907 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004908 }
4909
4910 switch (pname)
4911 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004912 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
4913 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
4914 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
4915 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
4916 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
4917 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Geoff Langcec35902014-04-16 10:52:36 -04004918 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004919 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
4920 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004921 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
4922 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
4923 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
4924 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004925 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
4926 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
4927 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
4928 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004929 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004930 }
4931 }
4932 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004933 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004936 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004937}
4938
4939void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4940{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004941 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004942}
4943
4944void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004946 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947
4948 try
4949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004950 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951
4952 if (context)
4953 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004954 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04004955 {
4956 return;
4957 }
4958
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004959 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960
Jamie Madillfb8a8302013-07-03 14:24:12 -04004961 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004963 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004964 }
4965
4966 switch (pname)
4967 {
Jamie Madill478fdb22013-07-19 16:36:59 -04004968 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
4969 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
4970 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
4971 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
4972 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
4973 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
Geoff Langcec35902014-04-16 10:52:36 -04004974 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004975 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
4976 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04004977 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
4978 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
4979 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
4980 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04004981 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
4982 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
4983 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
4984 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04004985 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986 }
4987 }
4988 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004989 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004992 }
4993}
4994
4995void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4996{
4997 glTexParameteri(target, pname, *params);
4998}
4999
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005000void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5001{
5002 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5003 target, levels, internalformat, width, height);
5004
5005 try
5006 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005007 gl::Context *context = gl::getNonLostContext();
5008
5009 if (context)
5010 {
Geoff Langcec35902014-04-16 10:52:36 -04005011 if (!context->getCaps().extensions.textureStorage)
5012 {
5013 return gl::error(GL_INVALID_OPERATION);
5014 }
5015
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005016 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005017 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005018 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005019 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005020 }
5021
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005022 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005023 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005024 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005025 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005026 }
5027
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005028 switch (target)
5029 {
5030 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005031 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005032 gl::Texture2D *texture2d = context->getTexture2D();
5033 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005034 }
5035 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005036
Geoff Lang01c21d22013-09-24 11:52:16 -04005037 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005038 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005039 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5040 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005041 }
5042 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005043
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005044 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005045 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005046 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005047 }
5048 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005049 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005051 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005052 }
5053}
5054
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005055void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5056 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005058 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005059 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005060 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061 target, level, xoffset, yoffset, width, height, format, type, pixels);
5062
5063 try
5064 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005066
5067 if (context)
5068 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005069 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005070 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005071 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005072 {
5073 return;
5074 }
5075
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005076 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005077 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005078 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005079 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005080 return;
5081 }
5082
Geoff Langc41e42d2014-04-28 10:58:16 -04005083 // Zero sized uploads are valid but no-ops
5084 if (width == 0 || height == 0)
5085 {
5086 return;
5087 }
5088
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005089 switch (target)
5090 {
5091 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005092 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005093 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005094 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005095 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005096 break;
5097
5098 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5099 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5100 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5101 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5102 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5103 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005104 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005105 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005106 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005107 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005108 break;
5109
5110 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005111 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005112 }
5113 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005115 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005117 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118 }
5119}
5120
5121void __stdcall glUniform1f(GLint location, GLfloat x)
5122{
5123 glUniform1fv(location, 1, &x);
5124}
5125
5126void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005128 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005129
5130 try
5131 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005133
5134 if (context)
5135 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005136 if (!ValidateUniform(context, GL_FLOAT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005137 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005138 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005139 }
5140
Jamie Madillaa981bd2014-05-20 10:55:55 -04005141 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005142 programBinary->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005143 }
5144 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005145 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148 }
5149}
5150
5151void __stdcall glUniform1i(GLint location, GLint x)
5152{
5153 glUniform1iv(location, 1, &x);
5154}
5155
5156void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5157{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005158 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159
5160 try
5161 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163
5164 if (context)
5165 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005166 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005167 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005168 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005169 }
5170
Jamie Madillaa981bd2014-05-20 10:55:55 -04005171 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005172 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005173 }
5174 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005175 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005177 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005178 }
5179}
5180
5181void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5182{
5183 GLfloat xy[2] = {x, y};
5184
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005185 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186}
5187
5188void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005190 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005191
5192 try
5193 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005194 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005195
5196 if (context)
5197 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005198 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005199 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005200 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005201 }
5202
Jamie Madillaa981bd2014-05-20 10:55:55 -04005203 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005204 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005205 }
5206 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005207 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 }
5211}
5212
5213void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5214{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005215 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005217 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218}
5219
5220void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5221{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005222 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223
5224 try
5225 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005227
5228 if (context)
5229 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005230 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005231 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005232 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005233 }
5234
Jamie Madillaa981bd2014-05-20 10:55:55 -04005235 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005236 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005237 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005238 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005239 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242 }
5243}
5244
5245void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5246{
5247 GLfloat xyz[3] = {x, y, z};
5248
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005249 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250}
5251
5252void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005254 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005255
5256 try
5257 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259
5260 if (context)
5261 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005262 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005263 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005264 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005265 }
5266
Jamie Madillaa981bd2014-05-20 10:55:55 -04005267 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005268 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005269 }
5270 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005271 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 }
5275}
5276
5277void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5278{
5279 GLint xyz[3] = {x, y, z};
5280
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005281 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282}
5283
5284void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005286 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287
5288 try
5289 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005291
5292 if (context)
5293 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005294 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005295 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005296 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005297 }
5298
Jamie Madillaa981bd2014-05-20 10:55:55 -04005299 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005300 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005302 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005303 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005305 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005306 }
5307}
5308
5309void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5310{
5311 GLfloat xyzw[4] = {x, y, z, w};
5312
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005313 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005314}
5315
5316void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005318 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319
5320 try
5321 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323
5324 if (context)
5325 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005326 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005327 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005328 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005329 }
5330
Jamie Madillaa981bd2014-05-20 10:55:55 -04005331 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005332 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333 }
5334 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005335 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005337 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 }
5339}
5340
5341void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5342{
5343 GLint xyzw[4] = {x, y, z, w};
5344
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005345 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346}
5347
5348void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5349{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005350 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005351
5352 try
5353 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005355
5356 if (context)
5357 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005358 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005359 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005360 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005361 }
5362
Jamie Madillaa981bd2014-05-20 10:55:55 -04005363 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005364 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005365 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005367 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005370 }
5371}
5372
5373void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5374{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005375 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005376 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005377
5378 try
5379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005381
5382 if (context)
5383 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005384 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005385 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005386 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005387 }
5388
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005389 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005390 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391 }
5392 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005393 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005396 }
5397}
5398
5399void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5400{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005401 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005402 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 try
5405 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005406 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005407
5408 if (context)
5409 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005410 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005411 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005412 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005413 }
5414
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005415 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005416 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417 }
5418 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005419 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005421 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005422 }
5423}
5424
5425void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5426{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005427 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005428 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429
5430 try
5431 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005433
5434 if (context)
5435 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005436 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005437 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005438 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005439 }
5440
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005441 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005442 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443 }
5444 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005445 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449}
5450
5451void __stdcall glUseProgram(GLuint program)
5452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005453 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454
5455 try
5456 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005457 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458
5459 if (context)
5460 {
5461 gl::Program *programObject = context->getProgram(program);
5462
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005463 if (!programObject && program != 0)
5464 {
5465 if (context->getShader(program))
5466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005468 }
5469 else
5470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005471 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005472 }
5473 }
5474
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005475 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 }
5479
5480 context->useProgram(program);
5481 }
5482 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005483 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005485 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005486 }
5487}
5488
5489void __stdcall glValidateProgram(GLuint program)
5490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005491 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492
5493 try
5494 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005495 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005496
5497 if (context)
5498 {
5499 gl::Program *programObject = context->getProgram(program);
5500
5501 if (!programObject)
5502 {
5503 if (context->getShader(program))
5504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005506 }
5507 else
5508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005509 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005510 }
5511 }
5512
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005513 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005514 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005516 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 }
5520}
5521
5522void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5523{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005524 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525
5526 try
5527 {
5528 if (index >= gl::MAX_VERTEX_ATTRIBS)
5529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005530 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005531 }
5532
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005533 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005534
5535 if (context)
5536 {
5537 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005538 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005539 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005541 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 }
5545}
5546
5547void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005549 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005550
5551 try
5552 {
5553 if (index >= gl::MAX_VERTEX_ATTRIBS)
5554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005555 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005556 }
5557
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005559
5560 if (context)
5561 {
5562 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005563 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005564 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005566 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005568 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569 }
5570}
5571
5572void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005574 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005575
5576 try
5577 {
5578 if (index >= gl::MAX_VERTEX_ATTRIBS)
5579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005580 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005581 }
5582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005584
5585 if (context)
5586 {
5587 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005588 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005589 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005590 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005591 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005593 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594 }
5595}
5596
5597void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005599 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005600
5601 try
5602 {
5603 if (index >= gl::MAX_VERTEX_ATTRIBS)
5604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 }
5607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005609
5610 if (context)
5611 {
5612 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005613 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005614 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005616 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005618 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005619 }
5620}
5621
5622void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005624 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 +00005625
5626 try
5627 {
5628 if (index >= gl::MAX_VERTEX_ATTRIBS)
5629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005630 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631 }
5632
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005633 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005634
5635 if (context)
5636 {
5637 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005638 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005639 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005641 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005644 }
5645}
5646
5647void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5648{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005649 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650
5651 try
5652 {
5653 if (index >= gl::MAX_VERTEX_ATTRIBS)
5654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005655 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005656 }
5657
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005658 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005659
5660 if (context)
5661 {
5662 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005663 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005664 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005666 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005669 }
5670}
5671
5672void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005674 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 +00005675
5676 try
5677 {
5678 if (index >= gl::MAX_VERTEX_ATTRIBS)
5679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005681 }
5682
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005683 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005684
5685 if (context)
5686 {
5687 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005688 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005689 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005690 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005691 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694 }
5695}
5696
5697void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5698{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005699 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700
5701 try
5702 {
5703 if (index >= gl::MAX_VERTEX_ATTRIBS)
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005708 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005709
5710 if (context)
5711 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005712 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005713 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005715 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719}
5720
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005721void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5722{
5723 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5724
5725 try
5726 {
5727 if (index >= gl::MAX_VERTEX_ATTRIBS)
5728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005730 }
5731
5732 gl::Context *context = gl::getNonLostContext();
5733
5734 if (context)
5735 {
5736 context->setVertexAttribDivisor(index, divisor);
5737 }
5738 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005739 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005742 }
5743}
5744
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005745void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005747 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005748 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005749 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005750
5751 try
5752 {
5753 if (index >= gl::MAX_VERTEX_ATTRIBS)
5754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 }
5757
5758 if (size < 1 || size > 4)
5759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005761 }
5762
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005763 gl::Context *context = gl::getNonLostContext();
5764
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005765 switch (type)
5766 {
5767 case GL_BYTE:
5768 case GL_UNSIGNED_BYTE:
5769 case GL_SHORT:
5770 case GL_UNSIGNED_SHORT:
5771 case GL_FIXED:
5772 case GL_FLOAT:
5773 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005774 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005775 case GL_INT:
5776 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005777 case GL_INT_2_10_10_10_REV:
5778 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005779 if (context && context->getClientVersion() < 3)
5780 {
5781 return gl::error(GL_INVALID_ENUM);
5782 }
5783 else
5784 {
5785 break;
5786 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005789 }
5790
5791 if (stride < 0)
5792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005793 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794 }
5795
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005796 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5797 {
5798 return gl::error(GL_INVALID_OPERATION);
5799 }
5800
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 if (context)
5802 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005803 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5804 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5805 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5806 // and the pointer argument is not NULL.
5807 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5808 {
5809 return gl::error(GL_INVALID_OPERATION);
5810 }
5811
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005812 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5813 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005814 }
5815 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005816 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 }
5820}
5821
5822void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005824 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 +00005825
5826 try
5827 {
5828 if (width < 0 || height < 0)
5829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005830 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831 }
5832
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005833 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005834
5835 if (context)
5836 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005837 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838 }
5839 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005840 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005842 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 }
5844}
5845
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005846// OpenGL ES 3.0 functions
5847
5848void __stdcall glReadBuffer(GLenum mode)
5849{
5850 EVENT("(GLenum mode = 0x%X)", mode);
5851
5852 try
5853 {
5854 gl::Context *context = gl::getNonLostContext();
5855
5856 if (context)
5857 {
5858 if (context->getClientVersion() < 3)
5859 {
5860 return gl::error(GL_INVALID_OPERATION);
5861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005862
Jamie Madill54133512013-06-21 09:33:07 -04005863 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005864 UNIMPLEMENTED();
5865 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005866 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005867 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005868 {
5869 return gl::error(GL_OUT_OF_MEMORY);
5870 }
5871}
5872
5873void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5874{
5875 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5876 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5877
5878 try
5879 {
5880 gl::Context *context = gl::getNonLostContext();
5881
5882 if (context)
5883 {
5884 if (context->getClientVersion() < 3)
5885 {
5886 return gl::error(GL_INVALID_OPERATION);
5887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005888
Jamie Madill54133512013-06-21 09:33:07 -04005889 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005890 UNIMPLEMENTED();
5891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005892 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005893 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005894 {
5895 return gl::error(GL_OUT_OF_MEMORY);
5896 }
5897}
5898
5899void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5900{
5901 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5902 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5903 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5904 target, level, internalformat, width, height, depth, border, format, type, pixels);
5905
5906 try
5907 {
5908 gl::Context *context = gl::getNonLostContext();
5909
5910 if (context)
5911 {
5912 if (context->getClientVersion() < 3)
5913 {
5914 return gl::error(GL_INVALID_OPERATION);
5915 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005916
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005917 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005918 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005919 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005920 {
5921 return;
5922 }
5923
5924 switch(target)
5925 {
5926 case GL_TEXTURE_3D:
5927 {
5928 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005929 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005930 }
5931 break;
5932
5933 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005934 {
5935 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005936 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005937 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005938 break;
5939
5940 default:
5941 return gl::error(GL_INVALID_ENUM);
5942 }
5943 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005944 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005945 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005946 {
5947 return gl::error(GL_OUT_OF_MEMORY);
5948 }
5949}
5950
5951void __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)
5952{
5953 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5954 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
5955 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5956 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
5957
5958 try
5959 {
5960 gl::Context *context = gl::getNonLostContext();
5961
5962 if (context)
5963 {
5964 if (context->getClientVersion() < 3)
5965 {
5966 return gl::error(GL_INVALID_OPERATION);
5967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005968
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005969 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005970 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005971 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04005972 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005973 {
5974 return;
5975 }
5976
Geoff Langc41e42d2014-04-28 10:58:16 -04005977 // Zero sized uploads are valid but no-ops
5978 if (width == 0 || height == 0 || depth == 0)
5979 {
5980 return;
5981 }
5982
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005983 switch(target)
5984 {
5985 case GL_TEXTURE_3D:
5986 {
5987 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005988 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 +00005989 }
5990 break;
5991
5992 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00005993 {
5994 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04005995 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 +00005996 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00005997 break;
5998
5999 default:
6000 return gl::error(GL_INVALID_ENUM);
6001 }
6002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006003 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006004 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006005 {
6006 return gl::error(GL_OUT_OF_MEMORY);
6007 }
6008}
6009
6010void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6011{
6012 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6013 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6014 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6015
6016 try
6017 {
6018 gl::Context *context = gl::getNonLostContext();
6019
6020 if (context)
6021 {
6022 if (context->getClientVersion() < 3)
6023 {
6024 return gl::error(GL_INVALID_OPERATION);
6025 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006026
Jamie Madill6f38f822014-06-06 17:12:20 -04006027 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006028 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006029 {
6030 return;
6031 }
6032
6033 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6034 gl::Texture *texture = NULL;
6035 switch (target)
6036 {
6037 case GL_TEXTURE_3D:
6038 texture = context->getTexture3D();
6039 break;
6040
6041 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006042 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006043 break;
6044
6045 default:
6046 return gl::error(GL_INVALID_ENUM);
6047 }
6048
6049 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006051 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006052 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006053 {
6054 return gl::error(GL_OUT_OF_MEMORY);
6055 }
6056}
6057
6058void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6059{
Geoff Langeef52cc2013-10-16 15:07:39 -04006060 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 +00006061 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6062 "const GLvoid* data = 0x%0.8p)",
6063 target, level, internalformat, width, height, depth, border, imageSize, data);
6064
6065 try
6066 {
6067 gl::Context *context = gl::getNonLostContext();
6068
6069 if (context)
6070 {
6071 if (context->getClientVersion() < 3)
6072 {
6073 return gl::error(GL_INVALID_OPERATION);
6074 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006075
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006076 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 +00006077 {
6078 return gl::error(GL_INVALID_VALUE);
6079 }
6080
6081 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006082 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006083 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006084 {
6085 return;
6086 }
6087
6088 switch(target)
6089 {
6090 case GL_TEXTURE_3D:
6091 {
6092 gl::Texture3D *texture = context->getTexture3D();
6093 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6094 }
6095 break;
6096
6097 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006098 {
6099 gl::Texture2DArray *texture = context->getTexture2DArray();
6100 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6101 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006102 break;
6103
6104 default:
6105 return gl::error(GL_INVALID_ENUM);
6106 }
6107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006108 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006109 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006110 {
6111 return gl::error(GL_OUT_OF_MEMORY);
6112 }
6113}
6114
6115void __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)
6116{
6117 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6118 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6119 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6120 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6121
6122 try
6123 {
6124 gl::Context *context = gl::getNonLostContext();
6125
6126 if (context)
6127 {
6128 if (context->getClientVersion() < 3)
6129 {
6130 return gl::error(GL_INVALID_OPERATION);
6131 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006132
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006133 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 +00006134 {
6135 return gl::error(GL_INVALID_VALUE);
6136 }
6137
6138 if (!data)
6139 {
6140 return gl::error(GL_INVALID_VALUE);
6141 }
6142
6143 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006144 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006145 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006146 {
6147 return;
6148 }
6149
Geoff Langc41e42d2014-04-28 10:58:16 -04006150 // Zero sized uploads are valid but no-ops
6151 if (width == 0 || height == 0)
6152 {
6153 return;
6154 }
6155
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006156 switch(target)
6157 {
6158 case GL_TEXTURE_3D:
6159 {
6160 gl::Texture3D *texture = context->getTexture3D();
6161 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6162 format, imageSize, data);
6163 }
6164 break;
6165
6166 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006167 {
6168 gl::Texture2DArray *texture = context->getTexture2DArray();
6169 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6170 format, imageSize, data);
6171 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006172 break;
6173
6174 default:
6175 return gl::error(GL_INVALID_ENUM);
6176 }
6177 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006178 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006179 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006180 {
6181 return gl::error(GL_OUT_OF_MEMORY);
6182 }
6183}
6184
6185void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6186{
6187 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6188
6189 try
6190 {
6191 gl::Context *context = gl::getNonLostContext();
6192
6193 if (context)
6194 {
6195 if (context->getClientVersion() < 3)
6196 {
6197 return gl::error(GL_INVALID_OPERATION);
6198 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006199
Geoff Lang37dde692014-01-31 16:34:54 -05006200 if (n < 0)
6201 {
6202 return gl::error(GL_INVALID_VALUE);
6203 }
6204
6205 for (GLsizei i = 0; i < n; i++)
6206 {
6207 ids[i] = context->createQuery();
6208 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006209 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006210 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006211 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006212 {
6213 return gl::error(GL_OUT_OF_MEMORY);
6214 }
6215}
6216
6217void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6218{
6219 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6220
6221 try
6222 {
6223 gl::Context *context = gl::getNonLostContext();
6224
6225 if (context)
6226 {
6227 if (context->getClientVersion() < 3)
6228 {
6229 return gl::error(GL_INVALID_OPERATION);
6230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006231
Geoff Lang37dde692014-01-31 16:34:54 -05006232 if (n < 0)
6233 {
6234 return gl::error(GL_INVALID_VALUE);
6235 }
6236
6237 for (GLsizei i = 0; i < n; i++)
6238 {
6239 context->deleteQuery(ids[i]);
6240 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006241 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006242 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006243 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006244 {
6245 return gl::error(GL_OUT_OF_MEMORY);
6246 }
6247}
6248
6249GLboolean __stdcall glIsQuery(GLuint id)
6250{
6251 EVENT("(GLuint id = %u)", id);
6252
6253 try
6254 {
6255 gl::Context *context = gl::getNonLostContext();
6256
6257 if (context)
6258 {
6259 if (context->getClientVersion() < 3)
6260 {
6261 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6262 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006263
Geoff Lang37dde692014-01-31 16:34:54 -05006264 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006266 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006267 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006268 {
6269 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6270 }
6271
6272 return GL_FALSE;
6273}
6274
6275void __stdcall glBeginQuery(GLenum target, GLuint id)
6276{
6277 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6278
6279 try
6280 {
6281 gl::Context *context = gl::getNonLostContext();
6282
6283 if (context)
6284 {
6285 if (context->getClientVersion() < 3)
6286 {
6287 return gl::error(GL_INVALID_OPERATION);
6288 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006289
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006290 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006291 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006292 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006293 }
Geoff Lang37dde692014-01-31 16:34:54 -05006294 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006295 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006296 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006297 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006298 {
6299 return gl::error(GL_OUT_OF_MEMORY);
6300 }
6301}
6302
6303void __stdcall glEndQuery(GLenum target)
6304{
6305 EVENT("(GLenum target = 0x%X)", target);
6306
6307 try
6308 {
6309 gl::Context *context = gl::getNonLostContext();
6310
6311 if (context)
6312 {
6313 if (context->getClientVersion() < 3)
6314 {
6315 return gl::error(GL_INVALID_OPERATION);
6316 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006317
Jamie Madill45c785d2014-05-13 14:09:34 -04006318 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006319 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006320 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006321 }
Geoff Lang37dde692014-01-31 16:34:54 -05006322
6323 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006324 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006325 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006326 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006327 {
6328 return gl::error(GL_OUT_OF_MEMORY);
6329 }
6330}
6331
6332void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6333{
6334 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6335
6336 try
6337 {
6338 gl::Context *context = gl::getNonLostContext();
6339
6340 if (context)
6341 {
6342 if (context->getClientVersion() < 3)
6343 {
6344 return gl::error(GL_INVALID_OPERATION);
6345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006346
Geoff Lang37dde692014-01-31 16:34:54 -05006347 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006348 {
Geoff Lang37dde692014-01-31 16:34:54 -05006349 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006350 }
Geoff Lang37dde692014-01-31 16:34:54 -05006351
6352 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006353 {
Geoff Lang37dde692014-01-31 16:34:54 -05006354 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006355 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006356 break;
6357
6358 default:
6359 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006360 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006362 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006363 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006364 {
6365 return gl::error(GL_OUT_OF_MEMORY);
6366 }
6367}
6368
6369void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6370{
6371 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6372
6373 try
6374 {
6375 gl::Context *context = gl::getNonLostContext();
6376
6377 if (context)
6378 {
6379 if (context->getClientVersion() < 3)
6380 {
6381 return gl::error(GL_INVALID_OPERATION);
6382 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006383
Geoff Lang37dde692014-01-31 16:34:54 -05006384 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6385
6386 if (!queryObject)
6387 {
6388 return gl::error(GL_INVALID_OPERATION);
6389 }
6390
Jamie Madill45c785d2014-05-13 14:09:34 -04006391 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006392 {
6393 return gl::error(GL_INVALID_OPERATION);
6394 }
6395
6396 switch(pname)
6397 {
6398 case GL_QUERY_RESULT:
6399 params[0] = queryObject->getResult();
6400 break;
6401 case GL_QUERY_RESULT_AVAILABLE:
6402 params[0] = queryObject->isResultAvailable();
6403 break;
6404 default:
6405 return gl::error(GL_INVALID_ENUM);
6406 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006407 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006408 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006409 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006410 {
6411 return gl::error(GL_OUT_OF_MEMORY);
6412 }
6413}
6414
6415GLboolean __stdcall glUnmapBuffer(GLenum target)
6416{
6417 EVENT("(GLenum target = 0x%X)", target);
6418
6419 try
6420 {
6421 gl::Context *context = gl::getNonLostContext();
6422
6423 if (context)
6424 {
6425 if (context->getClientVersion() < 3)
6426 {
6427 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006429
Shannon Woodsb3801742014-03-27 14:59:19 -04006430 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006431 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006432 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006433 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006434 {
6435 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6436 }
6437
6438 return GL_FALSE;
6439}
6440
6441void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6442{
6443 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6444
6445 try
6446 {
6447 gl::Context *context = gl::getNonLostContext();
6448
6449 if (context)
6450 {
6451 if (context->getClientVersion() < 3)
6452 {
6453 return gl::error(GL_INVALID_OPERATION);
6454 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006455
Shannon Woodsb3801742014-03-27 14:59:19 -04006456 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006458 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006459 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006460 {
6461 return gl::error(GL_OUT_OF_MEMORY);
6462 }
6463}
6464
6465void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6466{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006467 try
6468 {
6469 gl::Context *context = gl::getNonLostContext();
6470
6471 if (context)
6472 {
6473 if (context->getClientVersion() < 3)
6474 {
6475 return gl::error(GL_INVALID_OPERATION);
6476 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006477
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006478 glDrawBuffersEXT(n, bufs);
6479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006480 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006481 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006482 {
6483 return gl::error(GL_OUT_OF_MEMORY);
6484 }
6485}
6486
6487void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6488{
6489 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6490 location, count, transpose, value);
6491
6492 try
6493 {
6494 gl::Context *context = gl::getNonLostContext();
6495
6496 if (context)
6497 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006498 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006499 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006500 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006501 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006502
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006503 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006504 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006505 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006506 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006507 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006508 {
6509 return gl::error(GL_OUT_OF_MEMORY);
6510 }
6511}
6512
6513void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6514{
6515 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6516 location, count, transpose, value);
6517
6518 try
6519 {
6520 gl::Context *context = gl::getNonLostContext();
6521
6522 if (context)
6523 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006524 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006525 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006526 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006528
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006529 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006530 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006531 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006532 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006533 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006534 {
6535 return gl::error(GL_OUT_OF_MEMORY);
6536 }
6537}
6538
6539void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6540{
6541 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6542 location, count, transpose, value);
6543
6544 try
6545 {
6546 gl::Context *context = gl::getNonLostContext();
6547
6548 if (context)
6549 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006550 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006551 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006552 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006554
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006555 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006556 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006557 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006558 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006559 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006560 {
6561 return gl::error(GL_OUT_OF_MEMORY);
6562 }
6563}
6564
6565void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6566{
6567 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6568 location, count, transpose, value);
6569
6570 try
6571 {
6572 gl::Context *context = gl::getNonLostContext();
6573
6574 if (context)
6575 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006576 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006577 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006578 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006581 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006582 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006583 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006584 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006585 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006586 {
6587 return gl::error(GL_OUT_OF_MEMORY);
6588 }
6589}
6590
6591void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6592{
6593 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6594 location, count, transpose, value);
6595
6596 try
6597 {
6598 gl::Context *context = gl::getNonLostContext();
6599
6600 if (context)
6601 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006602 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006603 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006604 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006606
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006607 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006608 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006609 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006610 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006611 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006612 {
6613 return gl::error(GL_OUT_OF_MEMORY);
6614 }
6615}
6616
6617void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6618{
6619 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6620 location, count, transpose, value);
6621
6622 try
6623 {
6624 gl::Context *context = gl::getNonLostContext();
6625
6626 if (context)
6627 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006628 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006629 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006630 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006632
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006633 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006634 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006636 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006637 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006638 {
6639 return gl::error(GL_OUT_OF_MEMORY);
6640 }
6641}
6642
6643void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6644{
6645 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6646 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6647 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6648
6649 try
6650 {
6651 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006652 if (context)
6653 {
6654 if (context->getClientVersion() < 3)
6655 {
6656 return gl::error(GL_INVALID_OPERATION);
6657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006658
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006659 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006660 dstX0, dstY0, dstX1, dstY1, mask, filter,
6661 false))
6662 {
6663 return;
6664 }
6665
6666 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6667 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006668 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006669 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006670 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006671 {
6672 return gl::error(GL_OUT_OF_MEMORY);
6673 }
6674}
6675
6676void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6677{
6678 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6679 target, samples, internalformat, width, height);
6680
6681 try
6682 {
6683 gl::Context *context = gl::getNonLostContext();
6684
6685 if (context)
6686 {
6687 if (context->getClientVersion() < 3)
6688 {
6689 return gl::error(GL_INVALID_OPERATION);
6690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006691
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006692 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006693 width, height, false))
6694 {
6695 return;
6696 }
6697
6698 context->setRenderbufferStorage(width, height, internalformat, samples);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006699 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006700 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006701 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006702 {
6703 return gl::error(GL_OUT_OF_MEMORY);
6704 }
6705}
6706
6707void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6708{
6709 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6710 target, attachment, texture, level, layer);
6711
6712 try
6713 {
6714 gl::Context *context = gl::getNonLostContext();
6715
6716 if (context)
6717 {
6718 if (context->getClientVersion() < 3)
6719 {
6720 return gl::error(GL_INVALID_OPERATION);
6721 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006722
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006723 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006724 {
6725 return;
6726 }
6727
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006728 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6729 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006730
6731 gl::Texture *textureObject = context->getTexture(texture);
6732 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6733
6734 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6735 {
6736 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6737 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6738 }
6739 else
6740 {
6741 switch (attachment)
6742 {
6743 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6744 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6745 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6746 }
6747 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006749 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006750 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006751 {
6752 return gl::error(GL_OUT_OF_MEMORY);
6753 }
6754}
6755
6756GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6757{
6758 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6759 target, offset, length, access);
6760
6761 try
6762 {
6763 gl::Context *context = gl::getNonLostContext();
6764
6765 if (context)
6766 {
6767 if (context->getClientVersion() < 3)
6768 {
6769 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006771
Shannon Woods916e7692014-03-27 16:58:22 -04006772 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006774 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006775 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006776 {
6777 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6778 }
6779
6780 return NULL;
6781}
6782
6783void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6784{
6785 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6786
6787 try
6788 {
6789 gl::Context *context = gl::getNonLostContext();
6790
6791 if (context)
6792 {
6793 if (context->getClientVersion() < 3)
6794 {
6795 return gl::error(GL_INVALID_OPERATION);
6796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006797
Shannon Woods916e7692014-03-27 16:58:22 -04006798 glFlushMappedBufferRangeEXT(target, offset, length);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006799 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006800 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006801 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006802 {
6803 return gl::error(GL_OUT_OF_MEMORY);
6804 }
6805}
6806
6807void __stdcall glBindVertexArray(GLuint array)
6808{
6809 EVENT("(GLuint array = %u)", array);
6810
6811 try
6812 {
6813 gl::Context *context = gl::getNonLostContext();
6814
6815 if (context)
6816 {
6817 if (context->getClientVersion() < 3)
6818 {
6819 return gl::error(GL_INVALID_OPERATION);
6820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006821
Jamie Madilld1028542013-07-02 11:57:04 -04006822 gl::VertexArray *vao = context->getVertexArray(array);
6823
6824 if (!vao)
6825 {
6826 // The default VAO should always exist
6827 ASSERT(array != 0);
6828 return gl::error(GL_INVALID_OPERATION);
6829 }
6830
6831 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006833 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006834 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006835 {
6836 return gl::error(GL_OUT_OF_MEMORY);
6837 }
6838}
6839
6840void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6841{
6842 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6843
6844 try
6845 {
6846 gl::Context *context = gl::getNonLostContext();
6847
6848 if (context)
6849 {
6850 if (context->getClientVersion() < 3)
6851 {
6852 return gl::error(GL_INVALID_OPERATION);
6853 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006854
Jamie Madilld1028542013-07-02 11:57:04 -04006855 if (n < 0)
6856 {
6857 return gl::error(GL_INVALID_VALUE);
6858 }
6859
6860 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6861 {
6862 if (arrays[arrayIndex] != 0)
6863 {
6864 context->deleteVertexArray(arrays[arrayIndex]);
6865 }
6866 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006867 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006868 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006869 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006870 {
6871 return gl::error(GL_OUT_OF_MEMORY);
6872 }
6873}
6874
6875void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6876{
6877 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6878
6879 try
6880 {
6881 gl::Context *context = gl::getNonLostContext();
6882
6883 if (context)
6884 {
6885 if (context->getClientVersion() < 3)
6886 {
6887 return gl::error(GL_INVALID_OPERATION);
6888 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006889
Jamie Madilld1028542013-07-02 11:57:04 -04006890 if (n < 0)
6891 {
6892 return gl::error(GL_INVALID_VALUE);
6893 }
6894
6895 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6896 {
6897 arrays[arrayIndex] = context->createVertexArray();
6898 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006899 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006900 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006901 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006902 {
6903 return gl::error(GL_OUT_OF_MEMORY);
6904 }
6905}
6906
6907GLboolean __stdcall glIsVertexArray(GLuint array)
6908{
6909 EVENT("(GLuint array = %u)", array);
6910
6911 try
6912 {
6913 gl::Context *context = gl::getNonLostContext();
6914
6915 if (context)
6916 {
6917 if (context->getClientVersion() < 3)
6918 {
6919 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921
Jamie Madilld1028542013-07-02 11:57:04 -04006922 if (array == 0)
6923 {
6924 return GL_FALSE;
6925 }
6926
6927 gl::VertexArray *vao = context->getVertexArray(array);
6928
6929 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006930 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006931 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006932 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006933 {
6934 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6935 }
6936
6937 return GL_FALSE;
6938}
6939
6940void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
6941{
6942 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
6943 target, index, data);
6944
6945 try
6946 {
6947 gl::Context *context = gl::getNonLostContext();
6948
6949 if (context)
6950 {
6951 if (context->getClientVersion() < 3)
6952 {
6953 return gl::error(GL_INVALID_OPERATION);
6954 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006955
Shannon Woods15934d52013-08-19 14:28:49 -04006956 switch (target)
6957 {
6958 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
6959 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
6960 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
6961 if (index >= context->getMaxTransformFeedbackBufferBindings())
6962 return gl::error(GL_INVALID_VALUE);
6963 break;
6964 case GL_UNIFORM_BUFFER_START:
6965 case GL_UNIFORM_BUFFER_SIZE:
6966 case GL_UNIFORM_BUFFER_BINDING:
6967 if (index >= context->getMaximumCombinedUniformBufferBindings())
6968 return gl::error(GL_INVALID_VALUE);
6969 break;
6970 default:
6971 return gl::error(GL_INVALID_ENUM);
6972 }
6973
6974 if (!(context->getIndexedIntegerv(target, index, data)))
6975 {
6976 GLenum nativeType;
6977 unsigned int numParams = 0;
6978 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
6979 return gl::error(GL_INVALID_ENUM);
6980
6981 if (numParams == 0)
6982 return; // it is known that pname is valid, but there are no parameters to return
6983
6984 if (nativeType == GL_INT_64_ANGLEX)
6985 {
6986 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
6987 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
6988 GLint64 *int64Params = new GLint64[numParams];
6989
6990 context->getIndexedInteger64v(target, index, int64Params);
6991
6992 for (unsigned int i = 0; i < numParams; ++i)
6993 {
6994 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
6995 data[i] = static_cast<GLint>(clampedValue);
6996 }
6997
6998 delete [] int64Params;
6999 }
7000 else
7001 {
7002 UNREACHABLE();
7003 }
7004 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007006 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007007 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007008 {
7009 return gl::error(GL_OUT_OF_MEMORY);
7010 }
7011}
7012
7013void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7014{
7015 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7016
7017 try
7018 {
7019 gl::Context *context = gl::getNonLostContext();
7020
7021 if (context)
7022 {
7023 if (context->getClientVersion() < 3)
7024 {
7025 return gl::error(GL_INVALID_OPERATION);
7026 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007027
Geoff Langc8058452014-02-03 12:04:11 -05007028 switch (primitiveMode)
7029 {
7030 case GL_TRIANGLES:
7031 case GL_LINES:
7032 case GL_POINTS:
7033 break;
7034 default:
7035 return gl::error(GL_INVALID_ENUM);
7036 }
7037
7038 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7039 ASSERT(transformFeedback != NULL);
7040
7041 if (transformFeedback->isStarted())
7042 {
7043 return gl::error(GL_INVALID_OPERATION);
7044 }
7045
7046 if (transformFeedback->isPaused())
7047 {
7048 transformFeedback->resume();
7049 }
7050 else
7051 {
7052 transformFeedback->start(primitiveMode);
7053 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007055 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007056 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007057 {
7058 return gl::error(GL_OUT_OF_MEMORY);
7059 }
7060}
7061
7062void __stdcall glEndTransformFeedback(void)
7063{
7064 EVENT("(void)");
7065
7066 try
7067 {
7068 gl::Context *context = gl::getNonLostContext();
7069
7070 if (context)
7071 {
7072 if (context->getClientVersion() < 3)
7073 {
7074 return gl::error(GL_INVALID_OPERATION);
7075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007076
Geoff Langc8058452014-02-03 12:04:11 -05007077 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7078 ASSERT(transformFeedback != NULL);
7079
7080 if (!transformFeedback->isStarted())
7081 {
7082 return gl::error(GL_INVALID_OPERATION);
7083 }
7084
7085 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007087 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007088 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007089 {
7090 return gl::error(GL_OUT_OF_MEMORY);
7091 }
7092}
7093
7094void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7095{
7096 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7097 target, index, buffer, offset, size);
7098
7099 try
7100 {
7101 gl::Context *context = gl::getNonLostContext();
7102
7103 if (context)
7104 {
7105 if (context->getClientVersion() < 3)
7106 {
7107 return gl::error(GL_INVALID_OPERATION);
7108 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007109
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007110 switch (target)
7111 {
7112 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007113 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007114 {
7115 return gl::error(GL_INVALID_VALUE);
7116 }
7117 break;
7118
7119 case GL_UNIFORM_BUFFER:
7120 if (index >= context->getMaximumCombinedUniformBufferBindings())
7121 {
7122 return gl::error(GL_INVALID_VALUE);
7123 }
7124 break;
7125
7126 default:
7127 return gl::error(GL_INVALID_ENUM);
7128 }
7129
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007130 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007131 {
7132 return gl::error(GL_INVALID_VALUE);
7133 }
7134
7135 switch (target)
7136 {
7137 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007138
7139 // size and offset must be a multiple of 4
7140 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7141 {
7142 return gl::error(GL_INVALID_VALUE);
7143 }
7144
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007145 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7146 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007147 break;
7148
7149 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007150
7151 // it is an error to bind an offset not a multiple of the alignment
7152 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7153 {
7154 return gl::error(GL_INVALID_VALUE);
7155 }
7156
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007157 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7158 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007159 break;
7160
7161 default:
7162 UNREACHABLE();
7163 }
7164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007165 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007166 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167 {
7168 return gl::error(GL_OUT_OF_MEMORY);
7169 }
7170}
7171
7172void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7173{
7174 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7175 target, index, buffer);
7176
7177 try
7178 {
7179 gl::Context *context = gl::getNonLostContext();
7180
7181 if (context)
7182 {
7183 if (context->getClientVersion() < 3)
7184 {
7185 return gl::error(GL_INVALID_OPERATION);
7186 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007187
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007188 switch (target)
7189 {
7190 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007191 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007192 {
7193 return gl::error(GL_INVALID_VALUE);
7194 }
7195 break;
7196
7197 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007198 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007199 {
7200 return gl::error(GL_INVALID_VALUE);
7201 }
7202 break;
7203
7204 default:
7205 return gl::error(GL_INVALID_ENUM);
7206 }
7207
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007208 switch (target)
7209 {
7210 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007211 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007212 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007213 break;
7214
7215 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007216 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007217 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007218 break;
7219
7220 default:
7221 UNREACHABLE();
7222 }
7223 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007224 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007225 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007226 {
7227 return gl::error(GL_OUT_OF_MEMORY);
7228 }
7229}
7230
7231void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7232{
7233 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7234 program, count, varyings, bufferMode);
7235
7236 try
7237 {
7238 gl::Context *context = gl::getNonLostContext();
7239
7240 if (context)
7241 {
7242 if (context->getClientVersion() < 3)
7243 {
7244 return gl::error(GL_INVALID_OPERATION);
7245 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007246
Geoff Lang48dcae72014-02-05 16:28:24 -05007247 if (count < 0)
7248 {
7249 return gl::error(GL_INVALID_VALUE);
7250 }
7251
7252 switch (bufferMode)
7253 {
7254 case GL_INTERLEAVED_ATTRIBS:
7255 break;
7256 case GL_SEPARATE_ATTRIBS:
7257 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7258 {
7259 return gl::error(GL_INVALID_VALUE);
7260 }
7261 break;
7262 default:
7263 return gl::error(GL_INVALID_ENUM);
7264 }
7265
7266 if (!gl::ValidProgram(context, program))
7267 {
7268 return;
7269 }
7270
7271 gl::Program *programObject = context->getProgram(program);
7272 ASSERT(programObject);
7273
7274 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007276 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007277 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007278 {
7279 return gl::error(GL_OUT_OF_MEMORY);
7280 }
7281}
7282
7283void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7284{
7285 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7286 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7287 program, index, bufSize, length, size, type, name);
7288
7289 try
7290 {
7291 gl::Context *context = gl::getNonLostContext();
7292
7293 if (context)
7294 {
7295 if (context->getClientVersion() < 3)
7296 {
7297 return gl::error(GL_INVALID_OPERATION);
7298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007299
Geoff Lang48dcae72014-02-05 16:28:24 -05007300 if (bufSize < 0)
7301 {
7302 return gl::error(GL_INVALID_VALUE);
7303 }
7304
7305 if (!gl::ValidProgram(context, program))
7306 {
7307 return;
7308 }
7309
7310 gl::Program *programObject = context->getProgram(program);
7311 ASSERT(programObject);
7312
7313 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7314 {
7315 return gl::error(GL_INVALID_VALUE);
7316 }
7317
7318 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007320 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007321 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007322 {
7323 return gl::error(GL_OUT_OF_MEMORY);
7324 }
7325}
7326
7327void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7328{
7329 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7330 index, size, type, stride, pointer);
7331
7332 try
7333 {
7334 gl::Context *context = gl::getNonLostContext();
7335
7336 if (context)
7337 {
7338 if (context->getClientVersion() < 3)
7339 {
7340 return gl::error(GL_INVALID_OPERATION);
7341 }
7342 }
7343
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007344 if (index >= gl::MAX_VERTEX_ATTRIBS)
7345 {
7346 return gl::error(GL_INVALID_VALUE);
7347 }
7348
7349 if (size < 1 || size > 4)
7350 {
7351 return gl::error(GL_INVALID_VALUE);
7352 }
7353
7354 switch (type)
7355 {
7356 case GL_BYTE:
7357 case GL_UNSIGNED_BYTE:
7358 case GL_SHORT:
7359 case GL_UNSIGNED_SHORT:
7360 case GL_INT:
7361 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007362 case GL_INT_2_10_10_10_REV:
7363 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007364 break;
7365 default:
7366 return gl::error(GL_INVALID_ENUM);
7367 }
7368
7369 if (stride < 0)
7370 {
7371 return gl::error(GL_INVALID_VALUE);
7372 }
7373
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007374 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7375 {
7376 return gl::error(GL_INVALID_OPERATION);
7377 }
7378
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007379 if (context)
7380 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007381 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7382 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7383 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7384 // and the pointer argument is not NULL.
7385 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7386 {
7387 return gl::error(GL_INVALID_OPERATION);
7388 }
7389
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007390 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7391 stride, pointer);
7392 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007393 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007394 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007395 {
7396 return gl::error(GL_OUT_OF_MEMORY);
7397 }
7398}
7399
7400void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7401{
7402 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7403 index, pname, params);
7404
7405 try
7406 {
7407 gl::Context *context = gl::getNonLostContext();
7408
7409 if (context)
7410 {
7411 if (context->getClientVersion() < 3)
7412 {
7413 return gl::error(GL_INVALID_OPERATION);
7414 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007415
Jamie Madilla7d05862013-07-02 11:57:06 -04007416 if (index >= gl::MAX_VERTEX_ATTRIBS)
7417 {
7418 return gl::error(GL_INVALID_VALUE);
7419 }
7420
7421 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7422
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007423 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007424 {
7425 return;
7426 }
7427
7428 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7429 {
7430 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7431 for (int i = 0; i < 4; ++i)
7432 {
7433 params[i] = currentValueData.IntValues[i];
7434 }
7435 }
7436 else
7437 {
7438 *params = attribState.querySingleParameter<GLint>(pname);
7439 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007440 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007441 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007442 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007443 {
7444 return gl::error(GL_OUT_OF_MEMORY);
7445 }
7446}
7447
7448void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7449{
7450 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7451 index, pname, params);
7452
7453 try
7454 {
7455 gl::Context *context = gl::getNonLostContext();
7456
7457 if (context)
7458 {
7459 if (context->getClientVersion() < 3)
7460 {
7461 return gl::error(GL_INVALID_OPERATION);
7462 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007463
Jamie Madilla7d05862013-07-02 11:57:06 -04007464 if (index >= gl::MAX_VERTEX_ATTRIBS)
7465 {
7466 return gl::error(GL_INVALID_VALUE);
7467 }
7468
7469 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7470
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007471 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007472 {
7473 return;
7474 }
7475
7476 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7477 {
7478 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7479 for (int i = 0; i < 4; ++i)
7480 {
7481 params[i] = currentValueData.UnsignedIntValues[i];
7482 }
7483 }
7484 else
7485 {
7486 *params = attribState.querySingleParameter<GLuint>(pname);
7487 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007488 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007489 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007490 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007491 {
7492 return gl::error(GL_OUT_OF_MEMORY);
7493 }
7494}
7495
7496void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7497{
7498 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7499 index, x, y, z, w);
7500
7501 try
7502 {
7503 gl::Context *context = gl::getNonLostContext();
7504
7505 if (context)
7506 {
7507 if (context->getClientVersion() < 3)
7508 {
7509 return gl::error(GL_INVALID_OPERATION);
7510 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007511
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007512 if (index >= gl::MAX_VERTEX_ATTRIBS)
7513 {
7514 return gl::error(GL_INVALID_VALUE);
7515 }
7516
7517 GLint vals[4] = { x, y, z, w };
7518 context->setVertexAttribi(index, vals);
7519 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007520 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007521 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007522 {
7523 return gl::error(GL_OUT_OF_MEMORY);
7524 }
7525}
7526
7527void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7528{
7529 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7530 index, x, y, z, w);
7531
7532 try
7533 {
7534 gl::Context *context = gl::getNonLostContext();
7535
7536 if (context)
7537 {
7538 if (context->getClientVersion() < 3)
7539 {
7540 return gl::error(GL_INVALID_OPERATION);
7541 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007542
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007543 if (index >= gl::MAX_VERTEX_ATTRIBS)
7544 {
7545 return gl::error(GL_INVALID_VALUE);
7546 }
7547
7548 GLuint vals[4] = { x, y, z, w };
7549 context->setVertexAttribu(index, vals);
7550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007551 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007552 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007553 {
7554 return gl::error(GL_OUT_OF_MEMORY);
7555 }
7556}
7557
7558void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7559{
7560 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7561
7562 try
7563 {
7564 gl::Context *context = gl::getNonLostContext();
7565
7566 if (context)
7567 {
7568 if (context->getClientVersion() < 3)
7569 {
7570 return gl::error(GL_INVALID_OPERATION);
7571 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007572
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007573 if (index >= gl::MAX_VERTEX_ATTRIBS)
7574 {
7575 return gl::error(GL_INVALID_VALUE);
7576 }
7577
7578 context->setVertexAttribi(index, v);
7579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007581 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007582 {
7583 return gl::error(GL_OUT_OF_MEMORY);
7584 }
7585}
7586
7587void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7588{
7589 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7590
7591 try
7592 {
7593 gl::Context *context = gl::getNonLostContext();
7594
7595 if (context)
7596 {
7597 if (context->getClientVersion() < 3)
7598 {
7599 return gl::error(GL_INVALID_OPERATION);
7600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007601
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007602 if (index >= gl::MAX_VERTEX_ATTRIBS)
7603 {
7604 return gl::error(GL_INVALID_VALUE);
7605 }
7606
7607 context->setVertexAttribu(index, v);
7608 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007609 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007610 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007611 {
7612 return gl::error(GL_OUT_OF_MEMORY);
7613 }
7614}
7615
7616void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7617{
7618 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7619 program, location, params);
7620
7621 try
7622 {
7623 gl::Context *context = gl::getNonLostContext();
7624
7625 if (context)
7626 {
7627 if (context->getClientVersion() < 3)
7628 {
7629 return gl::error(GL_INVALID_OPERATION);
7630 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007631
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007632 if (program == 0)
7633 {
7634 return gl::error(GL_INVALID_VALUE);
7635 }
7636
7637 gl::Program *programObject = context->getProgram(program);
7638
7639 if (!programObject || !programObject->isLinked())
7640 {
7641 return gl::error(GL_INVALID_OPERATION);
7642 }
7643
7644 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7645 if (!programBinary)
7646 {
7647 return gl::error(GL_INVALID_OPERATION);
7648 }
7649
7650 if (!programBinary->getUniformuiv(location, NULL, params))
7651 {
7652 return gl::error(GL_INVALID_OPERATION);
7653 }
7654 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007655 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007656 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657 {
7658 return gl::error(GL_OUT_OF_MEMORY);
7659 }
7660}
7661
7662GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7663{
7664 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7665 program, name);
7666
7667 try
7668 {
7669 gl::Context *context = gl::getNonLostContext();
7670
7671 if (context)
7672 {
7673 if (context->getClientVersion() < 3)
7674 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007675 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007676 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007677
Jamie Madilld1e78c92013-06-20 11:55:50 -04007678 if (program == 0)
7679 {
7680 return gl::error(GL_INVALID_VALUE, -1);
7681 }
7682
7683 gl::Program *programObject = context->getProgram(program);
7684
7685 if (!programObject || !programObject->isLinked())
7686 {
7687 return gl::error(GL_INVALID_OPERATION, -1);
7688 }
7689
7690 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7691 if (!programBinary)
7692 {
7693 return gl::error(GL_INVALID_OPERATION, -1);
7694 }
7695
7696 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007697 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007698 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007699 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007700 {
7701 return gl::error(GL_OUT_OF_MEMORY, 0);
7702 }
7703
7704 return 0;
7705}
7706
7707void __stdcall glUniform1ui(GLint location, GLuint v0)
7708{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007709 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007710}
7711
7712void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7713{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007714 const GLuint xy[] = { v0, v1 };
7715 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007716}
7717
7718void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7719{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007720 const GLuint xyz[] = { v0, v1, v2 };
7721 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007722}
7723
7724void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7725{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007726 const GLuint xyzw[] = { v0, v1, v2, v3 };
7727 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007728}
7729
7730void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7731{
7732 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7733 location, count, value);
7734
7735 try
7736 {
7737 gl::Context *context = gl::getNonLostContext();
7738
7739 if (context)
7740 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007741 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007742 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007743 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007745
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007746 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007747 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007749 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007750 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007751 {
7752 return gl::error(GL_OUT_OF_MEMORY);
7753 }
7754}
7755
7756void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7757{
7758 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7759 location, count, value);
7760
7761 try
7762 {
7763 gl::Context *context = gl::getNonLostContext();
7764
7765 if (context)
7766 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007767 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007768 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007769 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007770 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007771
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007772 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007773 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007775 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007776 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777 {
7778 return gl::error(GL_OUT_OF_MEMORY);
7779 }
7780}
7781
7782void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7783{
7784 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7785 location, count, value);
7786
7787 try
7788 {
7789 gl::Context *context = gl::getNonLostContext();
7790
7791 if (context)
7792 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007793 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007794 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007795 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007796 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007797
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007798 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007799 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007800 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007801 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007802 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007803 {
7804 return gl::error(GL_OUT_OF_MEMORY);
7805 }
7806}
7807
7808void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7809{
7810 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7811 location, count, value);
7812
7813 try
7814 {
7815 gl::Context *context = gl::getNonLostContext();
7816
7817 if (context)
7818 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007819 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007820 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007821 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007823
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007824 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007825 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007826 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007827 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007828 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007829 {
7830 return gl::error(GL_OUT_OF_MEMORY);
7831 }
7832}
7833
7834void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7835{
7836 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7837 buffer, drawbuffer, value);
7838
7839 try
7840 {
7841 gl::Context *context = gl::getNonLostContext();
7842
7843 if (context)
7844 {
7845 if (context->getClientVersion() < 3)
7846 {
7847 return gl::error(GL_INVALID_OPERATION);
7848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007849
Geoff Lang42359ca2013-08-21 13:25:17 -04007850 switch (buffer)
7851 {
7852 case GL_COLOR:
7853 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7854 {
7855 return gl::error(GL_INVALID_VALUE);
7856 }
7857 break;
7858 case GL_STENCIL:
7859 if (drawbuffer != 0)
7860 {
7861 return gl::error(GL_INVALID_VALUE);
7862 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007863 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007864 default:
7865 return gl::error(GL_INVALID_ENUM);
7866 }
7867
7868 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007869 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007870 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007871 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007872 {
7873 return gl::error(GL_OUT_OF_MEMORY);
7874 }
7875}
7876
7877void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7878{
7879 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7880 buffer, drawbuffer, value);
7881
7882 try
7883 {
7884 gl::Context *context = gl::getNonLostContext();
7885
7886 if (context)
7887 {
7888 if (context->getClientVersion() < 3)
7889 {
7890 return gl::error(GL_INVALID_OPERATION);
7891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007892
Geoff Lang42359ca2013-08-21 13:25:17 -04007893 switch (buffer)
7894 {
7895 case GL_COLOR:
7896 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7897 {
7898 return gl::error(GL_INVALID_VALUE);
7899 }
7900 break;
7901 default:
7902 return gl::error(GL_INVALID_ENUM);
7903 }
7904
7905 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007906 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007907 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007908 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007909 {
7910 return gl::error(GL_OUT_OF_MEMORY);
7911 }
7912}
7913
7914void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
7915{
7916 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
7917 buffer, drawbuffer, value);
7918
7919 try
7920 {
7921 gl::Context *context = gl::getNonLostContext();
7922
7923 if (context)
7924 {
7925 if (context->getClientVersion() < 3)
7926 {
7927 return gl::error(GL_INVALID_OPERATION);
7928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007929
Geoff Lang42359ca2013-08-21 13:25:17 -04007930 switch (buffer)
7931 {
7932 case GL_COLOR:
7933 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7934 {
7935 return gl::error(GL_INVALID_VALUE);
7936 }
7937 break;
7938 case GL_DEPTH:
7939 if (drawbuffer != 0)
7940 {
7941 return gl::error(GL_INVALID_VALUE);
7942 }
7943 break;
7944 default:
7945 return gl::error(GL_INVALID_ENUM);
7946 }
7947
7948 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007949 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007950 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007951 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007952 {
7953 return gl::error(GL_OUT_OF_MEMORY);
7954 }
7955}
7956
7957void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
7958{
7959 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
7960 buffer, drawbuffer, depth, stencil);
7961
7962 try
7963 {
7964 gl::Context *context = gl::getNonLostContext();
7965
7966 if (context)
7967 {
7968 if (context->getClientVersion() < 3)
7969 {
7970 return gl::error(GL_INVALID_OPERATION);
7971 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007972
Geoff Lang42359ca2013-08-21 13:25:17 -04007973 switch (buffer)
7974 {
7975 case GL_DEPTH_STENCIL:
7976 if (drawbuffer != 0)
7977 {
7978 return gl::error(GL_INVALID_VALUE);
7979 }
7980 break;
7981 default:
7982 return gl::error(GL_INVALID_ENUM);
7983 }
7984
7985 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007987 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007988 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007989 {
7990 return gl::error(GL_OUT_OF_MEMORY);
7991 }
7992}
7993
7994const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
7995{
7996 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
7997
7998 try
7999 {
8000 gl::Context *context = gl::getNonLostContext();
8001
8002 if (context)
8003 {
8004 if (context->getClientVersion() < 3)
8005 {
8006 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008008
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008009 if (name != GL_EXTENSIONS)
8010 {
8011 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8012 }
8013
Geoff Langcec35902014-04-16 10:52:36 -04008014 if (index >= context->getExtensionStringCount())
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008015 {
8016 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8017 }
Geoff Langcec35902014-04-16 10:52:36 -04008018
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008019 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008021 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008022 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008023 {
8024 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8025 }
8026
8027 return NULL;
8028}
8029
8030void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8031{
8032 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8033 readTarget, writeTarget, readOffset, writeOffset, size);
8034
8035 try
8036 {
8037 gl::Context *context = gl::getNonLostContext();
8038
8039 if (context)
8040 {
8041 if (context->getClientVersion() < 3)
8042 {
8043 return gl::error(GL_INVALID_OPERATION);
8044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008045
Jamie Madill8c96d582014-03-05 15:01:23 -05008046 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008047 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008048 return gl::error(GL_INVALID_ENUM);
8049 }
8050
Jamie Madill8c96d582014-03-05 15:01:23 -05008051 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8052 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008053
8054 if (!readBuffer || !writeBuffer)
8055 {
8056 return gl::error(GL_INVALID_OPERATION);
8057 }
8058
Jamie Madill7a5f7382014-03-05 15:01:24 -05008059 if (readBuffer->mapped() || writeBuffer->mapped())
8060 {
8061 return gl::error(GL_INVALID_OPERATION);
8062 }
8063
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008064 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8065 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8066 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8067 {
8068 return gl::error(GL_INVALID_VALUE);
8069 }
8070
8071 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8072 {
8073 return gl::error(GL_INVALID_VALUE);
8074 }
8075
8076 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8077
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008078 // if size is zero, the copy is a successful no-op
8079 if (size > 0)
8080 {
8081 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8082 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008085 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008086 {
8087 return gl::error(GL_OUT_OF_MEMORY);
8088 }
8089}
8090
8091void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8092{
8093 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8094 program, uniformCount, uniformNames, uniformIndices);
8095
8096 try
8097 {
8098 gl::Context *context = gl::getNonLostContext();
8099
8100 if (context)
8101 {
8102 if (context->getClientVersion() < 3)
8103 {
8104 return gl::error(GL_INVALID_OPERATION);
8105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008106
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008107 if (uniformCount < 0)
8108 {
8109 return gl::error(GL_INVALID_VALUE);
8110 }
8111
8112 gl::Program *programObject = context->getProgram(program);
8113
8114 if (!programObject)
8115 {
8116 if (context->getShader(program))
8117 {
8118 return gl::error(GL_INVALID_OPERATION);
8119 }
8120 else
8121 {
8122 return gl::error(GL_INVALID_VALUE);
8123 }
8124 }
8125
8126 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8127 if (!programObject->isLinked() || !programBinary)
8128 {
8129 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8130 {
8131 uniformIndices[uniformId] = GL_INVALID_INDEX;
8132 }
8133 }
8134 else
8135 {
8136 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8137 {
8138 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8139 }
8140 }
8141 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008142 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008143 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008144 {
8145 return gl::error(GL_OUT_OF_MEMORY);
8146 }
8147}
8148
8149void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8150{
8151 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8152 program, uniformCount, uniformIndices, pname, params);
8153
8154 try
8155 {
8156 gl::Context *context = gl::getNonLostContext();
8157
8158 if (context)
8159 {
8160 if (context->getClientVersion() < 3)
8161 {
8162 return gl::error(GL_INVALID_OPERATION);
8163 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008165 if (uniformCount < 0)
8166 {
8167 return gl::error(GL_INVALID_VALUE);
8168 }
8169
8170 gl::Program *programObject = context->getProgram(program);
8171
8172 if (!programObject)
8173 {
8174 if (context->getShader(program))
8175 {
8176 return gl::error(GL_INVALID_OPERATION);
8177 }
8178 else
8179 {
8180 return gl::error(GL_INVALID_VALUE);
8181 }
8182 }
8183
8184 switch (pname)
8185 {
8186 case GL_UNIFORM_TYPE:
8187 case GL_UNIFORM_SIZE:
8188 case GL_UNIFORM_NAME_LENGTH:
8189 case GL_UNIFORM_BLOCK_INDEX:
8190 case GL_UNIFORM_OFFSET:
8191 case GL_UNIFORM_ARRAY_STRIDE:
8192 case GL_UNIFORM_MATRIX_STRIDE:
8193 case GL_UNIFORM_IS_ROW_MAJOR:
8194 break;
8195 default:
8196 return gl::error(GL_INVALID_ENUM);
8197 }
8198
8199 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8200
8201 if (!programBinary && uniformCount > 0)
8202 {
8203 return gl::error(GL_INVALID_VALUE);
8204 }
8205
8206 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8207 {
8208 const GLuint index = uniformIndices[uniformId];
8209
8210 if (index >= (GLuint)programBinary->getActiveUniformCount())
8211 {
8212 return gl::error(GL_INVALID_VALUE);
8213 }
8214 }
8215
8216 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8217 {
8218 const GLuint index = uniformIndices[uniformId];
8219 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8220 }
8221 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008222 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008223 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008224 {
8225 return gl::error(GL_OUT_OF_MEMORY);
8226 }
8227}
8228
8229GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8230{
8231 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8232
8233 try
8234 {
8235 gl::Context *context = gl::getNonLostContext();
8236
8237 if (context)
8238 {
8239 if (context->getClientVersion() < 3)
8240 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008241 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008243
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008244 gl::Program *programObject = context->getProgram(program);
8245
8246 if (!programObject)
8247 {
8248 if (context->getShader(program))
8249 {
8250 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8251 }
8252 else
8253 {
8254 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8255 }
8256 }
8257
8258 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8259 if (!programBinary)
8260 {
8261 return GL_INVALID_INDEX;
8262 }
8263
8264 return programBinary->getUniformBlockIndex(uniformBlockName);
8265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008266 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008267 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008268 {
8269 return gl::error(GL_OUT_OF_MEMORY, 0);
8270 }
8271
8272 return 0;
8273}
8274
8275void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8276{
8277 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8278 program, uniformBlockIndex, pname, params);
8279
8280 try
8281 {
8282 gl::Context *context = gl::getNonLostContext();
8283
8284 if (context)
8285 {
8286 if (context->getClientVersion() < 3)
8287 {
8288 return gl::error(GL_INVALID_OPERATION);
8289 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008290 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008291
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008292 if (!programObject)
8293 {
8294 if (context->getShader(program))
8295 {
8296 return gl::error(GL_INVALID_OPERATION);
8297 }
8298 else
8299 {
8300 return gl::error(GL_INVALID_VALUE);
8301 }
8302 }
8303
8304 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8305
8306 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8307 {
8308 return gl::error(GL_INVALID_VALUE);
8309 }
8310
8311 switch (pname)
8312 {
8313 case GL_UNIFORM_BLOCK_BINDING:
8314 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8315 break;
8316
8317 case GL_UNIFORM_BLOCK_DATA_SIZE:
8318 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8319 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8320 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8321 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8322 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8323 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8324 break;
8325
8326 default:
8327 return gl::error(GL_INVALID_ENUM);
8328 }
8329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008330 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008331 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008332 {
8333 return gl::error(GL_OUT_OF_MEMORY);
8334 }
8335}
8336
8337void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8338{
8339 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8340 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8341
8342 try
8343 {
8344 gl::Context *context = gl::getNonLostContext();
8345
8346 if (context)
8347 {
8348 if (context->getClientVersion() < 3)
8349 {
8350 return gl::error(GL_INVALID_OPERATION);
8351 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008352
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008353 gl::Program *programObject = context->getProgram(program);
8354
8355 if (!programObject)
8356 {
8357 if (context->getShader(program))
8358 {
8359 return gl::error(GL_INVALID_OPERATION);
8360 }
8361 else
8362 {
8363 return gl::error(GL_INVALID_VALUE);
8364 }
8365 }
8366
8367 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8368
8369 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8370 {
8371 return gl::error(GL_INVALID_VALUE);
8372 }
8373
8374 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008376 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008377 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008378 {
8379 return gl::error(GL_OUT_OF_MEMORY);
8380 }
8381}
8382
8383void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8384{
8385 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8386 program, uniformBlockIndex, uniformBlockBinding);
8387
8388 try
8389 {
8390 gl::Context *context = gl::getNonLostContext();
8391
8392 if (context)
8393 {
8394 if (context->getClientVersion() < 3)
8395 {
8396 return gl::error(GL_INVALID_OPERATION);
8397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008398
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008399 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8400 {
8401 return gl::error(GL_INVALID_VALUE);
8402 }
8403
8404 gl::Program *programObject = context->getProgram(program);
8405
8406 if (!programObject)
8407 {
8408 if (context->getShader(program))
8409 {
8410 return gl::error(GL_INVALID_OPERATION);
8411 }
8412 else
8413 {
8414 return gl::error(GL_INVALID_VALUE);
8415 }
8416 }
8417
8418 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8419
8420 // if never linked, there won't be any uniform blocks
8421 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8422 {
8423 return gl::error(GL_INVALID_VALUE);
8424 }
8425
8426 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008428 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008429 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008430 {
8431 return gl::error(GL_OUT_OF_MEMORY);
8432 }
8433}
8434
8435void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8436{
8437 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8438 mode, first, count, instanceCount);
8439
8440 try
8441 {
8442 gl::Context *context = gl::getNonLostContext();
8443
8444 if (context)
8445 {
8446 if (context->getClientVersion() < 3)
8447 {
8448 return gl::error(GL_INVALID_OPERATION);
8449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008450
Jamie Madill54133512013-06-21 09:33:07 -04008451 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008452 UNIMPLEMENTED();
8453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008454 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008455 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008456 {
8457 return gl::error(GL_OUT_OF_MEMORY);
8458 }
8459}
8460
8461void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8462{
8463 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8464 mode, count, type, indices, instanceCount);
8465
8466 try
8467 {
8468 gl::Context *context = gl::getNonLostContext();
8469
8470 if (context)
8471 {
8472 if (context->getClientVersion() < 3)
8473 {
8474 return gl::error(GL_INVALID_OPERATION);
8475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008476
Jamie Madill54133512013-06-21 09:33:07 -04008477 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008478 UNIMPLEMENTED();
8479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008480 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008481 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008482 {
8483 return gl::error(GL_OUT_OF_MEMORY);
8484 }
8485}
8486
8487GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8488{
8489 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8490
8491 try
8492 {
8493 gl::Context *context = gl::getNonLostContext();
8494
8495 if (context)
8496 {
8497 if (context->getClientVersion() < 3)
8498 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008499 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008500 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008501
Jamie Madill5215e1a2013-07-26 11:55:19 -04008502 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8503 {
8504 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8505 }
8506
8507 if (flags != 0)
8508 {
8509 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8510 }
8511
8512 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008513 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008514 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008515 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008516 {
8517 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8518 }
8519
8520 return NULL;
8521}
8522
8523GLboolean __stdcall glIsSync(GLsync sync)
8524{
8525 EVENT("(GLsync sync = 0x%0.8p)", sync);
8526
8527 try
8528 {
8529 gl::Context *context = gl::getNonLostContext();
8530
8531 if (context)
8532 {
8533 if (context->getClientVersion() < 3)
8534 {
8535 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8536 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008537
Jamie Madill5215e1a2013-07-26 11:55:19 -04008538 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008539 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008540 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008541 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008542 {
8543 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8544 }
8545
8546 return GL_FALSE;
8547}
8548
8549void __stdcall glDeleteSync(GLsync sync)
8550{
8551 EVENT("(GLsync sync = 0x%0.8p)", sync);
8552
8553 try
8554 {
8555 gl::Context *context = gl::getNonLostContext();
8556
8557 if (context)
8558 {
8559 if (context->getClientVersion() < 3)
8560 {
8561 return gl::error(GL_INVALID_OPERATION);
8562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008563
Jamie Madill5215e1a2013-07-26 11:55:19 -04008564 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8565 {
8566 return gl::error(GL_INVALID_VALUE);
8567 }
8568
8569 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008571 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008572 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008573 {
8574 return gl::error(GL_OUT_OF_MEMORY);
8575 }
8576}
8577
8578GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8579{
8580 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8581 sync, flags, timeout);
8582
8583 try
8584 {
8585 gl::Context *context = gl::getNonLostContext();
8586
8587 if (context)
8588 {
8589 if (context->getClientVersion() < 3)
8590 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008591 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008592 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008593
Jamie Madill5215e1a2013-07-26 11:55:19 -04008594 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8595 {
8596 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8597 }
8598
8599 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8600
8601 if (!fenceSync)
8602 {
8603 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8604 }
8605
8606 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008608 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008609 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008610 {
8611 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8612 }
8613
8614 return GL_FALSE;
8615}
8616
8617void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8618{
8619 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8620 sync, flags, timeout);
8621
8622 try
8623 {
8624 gl::Context *context = gl::getNonLostContext();
8625
8626 if (context)
8627 {
8628 if (context->getClientVersion() < 3)
8629 {
8630 return gl::error(GL_INVALID_OPERATION);
8631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008632
Jamie Madill5215e1a2013-07-26 11:55:19 -04008633 if (flags != 0)
8634 {
8635 return gl::error(GL_INVALID_VALUE);
8636 }
8637
8638 if (timeout != GL_TIMEOUT_IGNORED)
8639 {
8640 return gl::error(GL_INVALID_VALUE);
8641 }
8642
8643 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8644
8645 if (!fenceSync)
8646 {
8647 return gl::error(GL_INVALID_VALUE);
8648 }
8649
8650 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008652 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008653 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008654 {
8655 return gl::error(GL_OUT_OF_MEMORY);
8656 }
8657}
8658
8659void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8660{
8661 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8662 pname, params);
8663
8664 try
8665 {
8666 gl::Context *context = gl::getNonLostContext();
8667
8668 if (context)
8669 {
8670 if (context->getClientVersion() < 3)
8671 {
8672 return gl::error(GL_INVALID_OPERATION);
8673 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008674
Jamie Madill79f2f452013-12-19 11:13:02 -05008675 GLenum nativeType;
8676 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008677 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8678 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008679 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008680 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008681
8682 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008683 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008684 context->getInteger64v(pname, params);
8685 }
Jamie Madill55856b12014-01-02 13:59:50 -05008686 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008687 {
Jamie Madill55856b12014-01-02 13:59:50 -05008688 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008689 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008690 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008691 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008692 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008693 {
8694 return gl::error(GL_OUT_OF_MEMORY);
8695 }
8696}
8697
8698void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8699{
8700 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8701 sync, pname, bufSize, length, values);
8702
8703 try
8704 {
8705 gl::Context *context = gl::getNonLostContext();
8706
8707 if (context)
8708 {
8709 if (context->getClientVersion() < 3)
8710 {
8711 return gl::error(GL_INVALID_OPERATION);
8712 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008713
Jamie Madill5215e1a2013-07-26 11:55:19 -04008714 if (bufSize < 0)
8715 {
8716 return gl::error(GL_INVALID_VALUE);
8717 }
8718
8719 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8720
8721 if (!fenceSync)
8722 {
8723 return gl::error(GL_INVALID_VALUE);
8724 }
8725
8726 switch (pname)
8727 {
8728 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8729 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8730 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8731 case GL_SYNC_FLAGS: values[0] = 0; break;
8732
8733 default:
8734 return gl::error(GL_INVALID_ENUM);
8735 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008736 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008737 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008738 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008739 {
8740 return gl::error(GL_OUT_OF_MEMORY);
8741 }
8742}
8743
8744void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8745{
8746 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8747 target, index, data);
8748
8749 try
8750 {
8751 gl::Context *context = gl::getNonLostContext();
8752
8753 if (context)
8754 {
8755 if (context->getClientVersion() < 3)
8756 {
8757 return gl::error(GL_INVALID_OPERATION);
8758 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008759
Shannon Woods15934d52013-08-19 14:28:49 -04008760 switch (target)
8761 {
8762 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8763 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8764 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8765 if (index >= context->getMaxTransformFeedbackBufferBindings())
8766 return gl::error(GL_INVALID_VALUE);
8767 break;
8768 case GL_UNIFORM_BUFFER_START:
8769 case GL_UNIFORM_BUFFER_SIZE:
8770 case GL_UNIFORM_BUFFER_BINDING:
8771 if (index >= context->getMaximumCombinedUniformBufferBindings())
8772 return gl::error(GL_INVALID_VALUE);
8773 break;
8774 default:
8775 return gl::error(GL_INVALID_ENUM);
8776 }
8777
8778 if (!(context->getIndexedInteger64v(target, index, data)))
8779 {
8780 GLenum nativeType;
8781 unsigned int numParams = 0;
8782 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8783 return gl::error(GL_INVALID_ENUM);
8784
8785 if (numParams == 0)
8786 return; // it is known that pname is valid, but there are no parameters to return
8787
8788 if (nativeType == GL_INT)
8789 {
8790 GLint *intParams = new GLint[numParams];
8791
8792 context->getIndexedIntegerv(target, index, intParams);
8793
8794 for (unsigned int i = 0; i < numParams; ++i)
8795 {
8796 data[i] = static_cast<GLint64>(intParams[i]);
8797 }
8798
8799 delete [] intParams;
8800 }
8801 else
8802 {
8803 UNREACHABLE();
8804 }
8805 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008806 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008807 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008808 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008809 {
8810 return gl::error(GL_OUT_OF_MEMORY);
8811 }
8812}
8813
8814void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8815{
8816 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8817 target, pname, params);
8818
8819 try
8820 {
8821 gl::Context *context = gl::getNonLostContext();
8822
8823 if (context)
8824 {
8825 if (context->getClientVersion() < 3)
8826 {
8827 return gl::error(GL_INVALID_OPERATION);
8828 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008829
Jamie Madill70656a62014-03-05 15:01:26 -05008830 if (!gl::ValidBufferTarget(context, target))
8831 {
8832 return gl::error(GL_INVALID_ENUM);
8833 }
8834
8835 if (!gl::ValidBufferParameter(context, pname))
8836 {
8837 return gl::error(GL_INVALID_ENUM);
8838 }
8839
8840 gl::Buffer *buffer = context->getTargetBuffer(target);
8841
8842 if (!buffer)
8843 {
8844 // A null buffer means that "0" is bound to the requested buffer target
8845 return gl::error(GL_INVALID_OPERATION);
8846 }
8847
8848 switch (pname)
8849 {
8850 case GL_BUFFER_USAGE:
8851 *params = static_cast<GLint64>(buffer->usage());
8852 break;
8853 case GL_BUFFER_SIZE:
8854 *params = buffer->size();
8855 break;
8856 case GL_BUFFER_ACCESS_FLAGS:
8857 *params = static_cast<GLint64>(buffer->accessFlags());
8858 break;
8859 case GL_BUFFER_MAPPED:
8860 *params = static_cast<GLint64>(buffer->mapped());
8861 break;
8862 case GL_BUFFER_MAP_OFFSET:
8863 *params = buffer->mapOffset();
8864 break;
8865 case GL_BUFFER_MAP_LENGTH:
8866 *params = buffer->mapLength();
8867 break;
8868 default: UNREACHABLE(); break;
8869 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008871 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008872 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008873 {
8874 return gl::error(GL_OUT_OF_MEMORY);
8875 }
8876}
8877
8878void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8879{
8880 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8881
8882 try
8883 {
8884 gl::Context *context = gl::getNonLostContext();
8885
8886 if (context)
8887 {
8888 if (context->getClientVersion() < 3)
8889 {
8890 return gl::error(GL_INVALID_OPERATION);
8891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008892
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008893 if (count < 0)
8894 {
8895 return gl::error(GL_INVALID_VALUE);
8896 }
8897
8898 for (int i = 0; i < count; i++)
8899 {
8900 samplers[i] = context->createSampler();
8901 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008902 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008903 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008904 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008905 {
8906 return gl::error(GL_OUT_OF_MEMORY);
8907 }
8908}
8909
8910void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
8911{
8912 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
8913
8914 try
8915 {
8916 gl::Context *context = gl::getNonLostContext();
8917
8918 if (context)
8919 {
8920 if (context->getClientVersion() < 3)
8921 {
8922 return gl::error(GL_INVALID_OPERATION);
8923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008924
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008925 if (count < 0)
8926 {
8927 return gl::error(GL_INVALID_VALUE);
8928 }
8929
8930 for (int i = 0; i < count; i++)
8931 {
8932 context->deleteSampler(samplers[i]);
8933 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008935 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008936 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008937 {
8938 return gl::error(GL_OUT_OF_MEMORY);
8939 }
8940}
8941
8942GLboolean __stdcall glIsSampler(GLuint sampler)
8943{
8944 EVENT("(GLuint sampler = %u)", sampler);
8945
8946 try
8947 {
8948 gl::Context *context = gl::getNonLostContext();
8949
8950 if (context)
8951 {
8952 if (context->getClientVersion() < 3)
8953 {
8954 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008956
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008957 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008958 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008959 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008960 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008961 {
8962 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8963 }
8964
8965 return GL_FALSE;
8966}
8967
8968void __stdcall glBindSampler(GLuint unit, GLuint sampler)
8969{
8970 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
8971
8972 try
8973 {
8974 gl::Context *context = gl::getNonLostContext();
8975
8976 if (context)
8977 {
8978 if (context->getClientVersion() < 3)
8979 {
8980 return gl::error(GL_INVALID_OPERATION);
8981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008982
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008983 if (sampler != 0 && !context->isSampler(sampler))
8984 {
8985 return gl::error(GL_INVALID_OPERATION);
8986 }
8987
8988 if (unit >= context->getMaximumCombinedTextureImageUnits())
8989 {
8990 return gl::error(GL_INVALID_VALUE);
8991 }
8992
8993 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008994 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008995 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008996 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008997 {
8998 return gl::error(GL_OUT_OF_MEMORY);
8999 }
9000}
9001
9002void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9003{
9004 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9005
9006 try
9007 {
9008 gl::Context *context = gl::getNonLostContext();
9009
9010 if (context)
9011 {
9012 if (context->getClientVersion() < 3)
9013 {
9014 return gl::error(GL_INVALID_OPERATION);
9015 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009017 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009018 {
9019 return;
9020 }
9021
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009022 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009023 {
9024 return;
9025 }
9026
9027 if (!context->isSampler(sampler))
9028 {
9029 return gl::error(GL_INVALID_OPERATION);
9030 }
9031
9032 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009033 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009034 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009035 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009036 {
9037 return gl::error(GL_OUT_OF_MEMORY);
9038 }
9039}
9040
9041void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9042{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009043 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009044}
9045
9046void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9047{
9048 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9049
9050 try
9051 {
9052 gl::Context *context = gl::getNonLostContext();
9053
9054 if (context)
9055 {
9056 if (context->getClientVersion() < 3)
9057 {
9058 return gl::error(GL_INVALID_OPERATION);
9059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009061 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009062 {
9063 return;
9064 }
9065
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009066 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009067 {
9068 return;
9069 }
9070
9071 if (!context->isSampler(sampler))
9072 {
9073 return gl::error(GL_INVALID_OPERATION);
9074 }
9075
9076 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009078 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009079 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009080 {
9081 return gl::error(GL_OUT_OF_MEMORY);
9082 }
9083}
9084
9085void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9086{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009087 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009088}
9089
9090void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9091{
9092 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9093
9094 try
9095 {
9096 gl::Context *context = gl::getNonLostContext();
9097
9098 if (context)
9099 {
9100 if (context->getClientVersion() < 3)
9101 {
9102 return gl::error(GL_INVALID_OPERATION);
9103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009104
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009105 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009106 {
9107 return;
9108 }
9109
9110 if (!context->isSampler(sampler))
9111 {
9112 return gl::error(GL_INVALID_OPERATION);
9113 }
9114
9115 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009116 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009117 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009118 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009119 {
9120 return gl::error(GL_OUT_OF_MEMORY);
9121 }
9122}
9123
9124void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9125{
9126 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9127
9128 try
9129 {
9130 gl::Context *context = gl::getNonLostContext();
9131
9132 if (context)
9133 {
9134 if (context->getClientVersion() < 3)
9135 {
9136 return gl::error(GL_INVALID_OPERATION);
9137 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009138
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009139 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009140 {
9141 return;
9142 }
9143
9144 if (!context->isSampler(sampler))
9145 {
9146 return gl::error(GL_INVALID_OPERATION);
9147 }
9148
9149 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009151 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009152 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009153 {
9154 return gl::error(GL_OUT_OF_MEMORY);
9155 }
9156}
9157
9158void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9159{
9160 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9161
9162 try
9163 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009164 if (index >= gl::MAX_VERTEX_ATTRIBS)
9165 {
9166 return gl::error(GL_INVALID_VALUE);
9167 }
9168
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009169 gl::Context *context = gl::getNonLostContext();
9170
9171 if (context)
9172 {
9173 if (context->getClientVersion() < 3)
9174 {
9175 return gl::error(GL_INVALID_OPERATION);
9176 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009177
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009178 context->setVertexAttribDivisor(index, divisor);
9179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009180 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009181 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009182 {
9183 return gl::error(GL_OUT_OF_MEMORY);
9184 }
9185}
9186
9187void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9188{
9189 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9190
9191 try
9192 {
9193 gl::Context *context = gl::getNonLostContext();
9194
9195 if (context)
9196 {
9197 if (context->getClientVersion() < 3)
9198 {
9199 return gl::error(GL_INVALID_OPERATION);
9200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009201
Geoff Langc8058452014-02-03 12:04:11 -05009202 switch (target)
9203 {
9204 case GL_TRANSFORM_FEEDBACK:
9205 {
9206 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9207 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9208 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9209 {
9210 return gl::error(GL_INVALID_OPERATION);
9211 }
9212
9213 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9214 if (context->getTransformFeedback(id) == NULL)
9215 {
9216 return gl::error(GL_INVALID_OPERATION);
9217 }
9218
9219 context->bindTransformFeedback(id);
9220 }
9221 break;
9222
9223 default:
9224 return gl::error(GL_INVALID_ENUM);
9225 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009226 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009227 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009228 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009229 {
9230 return gl::error(GL_OUT_OF_MEMORY);
9231 }
9232}
9233
9234void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9235{
9236 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9237
9238 try
9239 {
9240 gl::Context *context = gl::getNonLostContext();
9241
9242 if (context)
9243 {
9244 if (context->getClientVersion() < 3)
9245 {
9246 return gl::error(GL_INVALID_OPERATION);
9247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009248
Geoff Langc8058452014-02-03 12:04:11 -05009249 for (int i = 0; i < n; i++)
9250 {
9251 context->deleteTransformFeedback(ids[i]);
9252 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009253 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009254 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009255 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009256 {
9257 return gl::error(GL_OUT_OF_MEMORY);
9258 }
9259}
9260
9261void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9262{
9263 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9264
9265 try
9266 {
9267 gl::Context *context = gl::getNonLostContext();
9268
9269 if (context)
9270 {
9271 if (context->getClientVersion() < 3)
9272 {
9273 return gl::error(GL_INVALID_OPERATION);
9274 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009275
Geoff Langc8058452014-02-03 12:04:11 -05009276 for (int i = 0; i < n; i++)
9277 {
9278 ids[i] = context->createTransformFeedback();
9279 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009280 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009281 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009282 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009283 {
9284 return gl::error(GL_OUT_OF_MEMORY);
9285 }
9286}
9287
9288GLboolean __stdcall glIsTransformFeedback(GLuint id)
9289{
9290 EVENT("(GLuint id = %u)", id);
9291
9292 try
9293 {
9294 gl::Context *context = gl::getNonLostContext();
9295
9296 if (context)
9297 {
9298 if (context->getClientVersion() < 3)
9299 {
9300 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9301 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009302
Geoff Langc8058452014-02-03 12:04:11 -05009303 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009304 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009305 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009306 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009307 {
9308 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9309 }
9310
9311 return GL_FALSE;
9312}
9313
9314void __stdcall glPauseTransformFeedback(void)
9315{
9316 EVENT("(void)");
9317
9318 try
9319 {
9320 gl::Context *context = gl::getNonLostContext();
9321
9322 if (context)
9323 {
9324 if (context->getClientVersion() < 3)
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328
Geoff Langc8058452014-02-03 12:04:11 -05009329 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9330 ASSERT(transformFeedback != NULL);
9331
9332 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9333 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9334 {
9335 return gl::error(GL_INVALID_OPERATION);
9336 }
9337
9338 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009339 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009340 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009341 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009342 {
9343 return gl::error(GL_OUT_OF_MEMORY);
9344 }
9345}
9346
9347void __stdcall glResumeTransformFeedback(void)
9348{
9349 EVENT("(void)");
9350
9351 try
9352 {
9353 gl::Context *context = gl::getNonLostContext();
9354
9355 if (context)
9356 {
9357 if (context->getClientVersion() < 3)
9358 {
9359 return gl::error(GL_INVALID_OPERATION);
9360 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009361
Geoff Langc8058452014-02-03 12:04:11 -05009362 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9363 ASSERT(transformFeedback != NULL);
9364
9365 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9366 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9367 {
9368 return gl::error(GL_INVALID_OPERATION);
9369 }
9370
9371 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009373 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009374 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009375 {
9376 return gl::error(GL_OUT_OF_MEMORY);
9377 }
9378}
9379
9380void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9381{
9382 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9383 program, bufSize, length, binaryFormat, binary);
9384
9385 try
9386 {
9387 gl::Context *context = gl::getNonLostContext();
9388
9389 if (context)
9390 {
9391 if (context->getClientVersion() < 3)
9392 {
9393 return gl::error(GL_INVALID_OPERATION);
9394 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009395
Jamie Madill54133512013-06-21 09:33:07 -04009396 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009397 UNIMPLEMENTED();
9398 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009399 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009400 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009401 {
9402 return gl::error(GL_OUT_OF_MEMORY);
9403 }
9404}
9405
9406void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9407{
9408 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9409 program, binaryFormat, binary, length);
9410
9411 try
9412 {
9413 gl::Context *context = gl::getNonLostContext();
9414
9415 if (context)
9416 {
9417 if (context->getClientVersion() < 3)
9418 {
9419 return gl::error(GL_INVALID_OPERATION);
9420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009421
Jamie Madill54133512013-06-21 09:33:07 -04009422 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009423 UNIMPLEMENTED();
9424 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009425 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009426 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009427 {
9428 return gl::error(GL_OUT_OF_MEMORY);
9429 }
9430}
9431
9432void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9433{
9434 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9435 program, pname, value);
9436
9437 try
9438 {
9439 gl::Context *context = gl::getNonLostContext();
9440
9441 if (context)
9442 {
9443 if (context->getClientVersion() < 3)
9444 {
9445 return gl::error(GL_INVALID_OPERATION);
9446 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009447
Jamie Madill54133512013-06-21 09:33:07 -04009448 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009449 UNIMPLEMENTED();
9450 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009451 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009452 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009453 {
9454 return gl::error(GL_OUT_OF_MEMORY);
9455 }
9456}
9457
9458void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9459{
9460 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9461 target, numAttachments, attachments);
9462
9463 try
9464 {
9465 gl::Context *context = gl::getNonLostContext();
9466
9467 if (context)
9468 {
9469 if (context->getClientVersion() < 3)
9470 {
9471 return gl::error(GL_INVALID_OPERATION);
9472 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009473
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009474 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009475 {
9476 return;
9477 }
9478
9479 int maxDimension = context->getMaximumRenderbufferDimension();
9480 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9481 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009482 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009483 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009484 {
9485 return gl::error(GL_OUT_OF_MEMORY);
9486 }
9487}
9488
9489void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9490{
9491 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9492 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9493 target, numAttachments, attachments, x, y, width, height);
9494
9495 try
9496 {
9497 gl::Context *context = gl::getNonLostContext();
9498
9499 if (context)
9500 {
9501 if (context->getClientVersion() < 3)
9502 {
9503 return gl::error(GL_INVALID_OPERATION);
9504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009505
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009506 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009507 {
9508 return;
9509 }
9510
9511 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9512 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009513 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009514 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009515 {
9516 return gl::error(GL_OUT_OF_MEMORY);
9517 }
9518}
9519
9520void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9521{
9522 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9523 target, levels, internalformat, width, height);
9524
9525 try
9526 {
9527 gl::Context *context = gl::getNonLostContext();
9528
9529 if (context)
9530 {
9531 if (context->getClientVersion() < 3)
9532 {
9533 return gl::error(GL_INVALID_OPERATION);
9534 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009535
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009536 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009537 {
9538 return;
9539 }
9540
9541 switch (target)
9542 {
9543 case GL_TEXTURE_2D:
9544 {
9545 gl::Texture2D *texture2d = context->getTexture2D();
9546 texture2d->storage(levels, internalformat, width, height);
9547 }
9548 break;
9549
Geoff Lang01c21d22013-09-24 11:52:16 -04009550 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009551 {
9552 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9553 textureCube->storage(levels, internalformat, width);
9554 }
9555 break;
9556
9557 default:
9558 return gl::error(GL_INVALID_ENUM);
9559 }
9560 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009561 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009562 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009563 {
9564 return gl::error(GL_OUT_OF_MEMORY);
9565 }
9566}
9567
9568void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9569{
9570 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9571 "GLsizei height = %d, GLsizei depth = %d)",
9572 target, levels, internalformat, width, height, depth);
9573
9574 try
9575 {
9576 gl::Context *context = gl::getNonLostContext();
9577
9578 if (context)
9579 {
9580 if (context->getClientVersion() < 3)
9581 {
9582 return gl::error(GL_INVALID_OPERATION);
9583 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009584
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009585 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009586 {
9587 return;
9588 }
9589
9590 switch (target)
9591 {
9592 case GL_TEXTURE_3D:
9593 {
9594 gl::Texture3D *texture3d = context->getTexture3D();
9595 texture3d->storage(levels, internalformat, width, height, depth);
9596 }
9597 break;
9598
9599 case GL_TEXTURE_2D_ARRAY:
9600 {
9601 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9602 texture2darray->storage(levels, internalformat, width, height, depth);
9603 }
9604 break;
9605
9606 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009607 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009608 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009609 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009610 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009611 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009612 {
9613 return gl::error(GL_OUT_OF_MEMORY);
9614 }
9615}
9616
9617void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9618{
9619 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9620 "GLint* params = 0x%0.8p)",
9621 target, internalformat, pname, bufSize, params);
9622
9623 try
9624 {
9625 gl::Context *context = gl::getNonLostContext();
9626
9627 if (context)
9628 {
9629 if (context->getClientVersion() < 3)
9630 {
9631 return gl::error(GL_INVALID_OPERATION);
9632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009633
Geoff Langcec35902014-04-16 10:52:36 -04009634 const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
9635 if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
Shannon Woods809d2502013-07-08 10:32:18 -04009636 {
9637 return gl::error(GL_INVALID_ENUM);
9638 }
9639
9640 if (target != GL_RENDERBUFFER)
9641 {
9642 return gl::error(GL_INVALID_ENUM);
9643 }
9644
9645 if (bufSize < 0)
9646 {
9647 return gl::error(GL_INVALID_VALUE);
9648 }
9649
9650 switch (pname)
9651 {
9652 case GL_NUM_SAMPLE_COUNTS:
9653 if (bufSize != 0)
9654 *params = context->getNumSampleCounts(internalformat);
9655 break;
9656 case GL_SAMPLES:
9657 context->getSampleCounts(internalformat, bufSize, params);
9658 break;
9659 default:
9660 return gl::error(GL_INVALID_ENUM);
9661 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009663 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009664 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009665 {
9666 return gl::error(GL_OUT_OF_MEMORY);
9667 }
9668}
9669
9670// Extension functions
9671
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009672void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9673 GLbitfield mask, GLenum filter)
9674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009675 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009676 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9677 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9678 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9679
9680 try
9681 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009683
9684 if (context)
9685 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009686 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009687 dstX0, dstY0, dstX1, dstY1, mask, filter,
9688 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009689 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009690 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009691 }
9692
Geoff Lang758d5b22013-06-11 11:42:50 -04009693 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9694 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009695 }
9696 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009697 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009700 }
9701}
9702
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009703void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9704 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009705{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009706 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009707 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009708 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009709 target, level, internalformat, width, height, depth, border, format, type, pixels);
9710
9711 try
9712 {
9713 UNIMPLEMENTED(); // FIXME
9714 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009715 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009718 }
9719}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009720
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009721void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9722 GLenum *binaryFormat, void *binary)
9723{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009724 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 +00009725 program, bufSize, length, binaryFormat, binary);
9726
9727 try
9728 {
9729 gl::Context *context = gl::getNonLostContext();
9730
9731 if (context)
9732 {
9733 gl::Program *programObject = context->getProgram(program);
9734
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009735 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009737 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009738 }
9739
9740 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9741
9742 if (!programBinary)
9743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009744 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009745 }
9746
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009747 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009749 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009750 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009751
9752 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009753 }
9754 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009755 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009757 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009758 }
9759}
9760
9761void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9762 const void *binary, GLint length)
9763{
9764 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9765 program, binaryFormat, binary, length);
9766
9767 try
9768 {
9769 gl::Context *context = gl::getNonLostContext();
9770
9771 if (context)
9772 {
9773 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009775 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009776 }
9777
9778 gl::Program *programObject = context->getProgram(program);
9779
9780 if (!programObject)
9781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009782 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009783 }
9784
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009785 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009786 }
9787 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009788 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009790 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009791 }
9792}
9793
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009794void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9795{
9796 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9797
9798 try
9799 {
9800 gl::Context *context = gl::getNonLostContext();
9801
9802 if (context)
9803 {
9804 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9805 {
9806 return gl::error(GL_INVALID_VALUE);
9807 }
9808
9809 if (context->getDrawFramebufferHandle() == 0)
9810 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009811 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009812 {
9813 return gl::error(GL_INVALID_OPERATION);
9814 }
9815
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009816 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009817 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009818 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009819 }
9820 }
9821 else
9822 {
9823 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9824 {
9825 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9826 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9827 {
9828 return gl::error(GL_INVALID_OPERATION);
9829 }
9830 }
9831 }
9832
9833 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9834
9835 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9836 {
9837 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9838 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009839
9840 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9841 {
9842 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9843 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009844 }
9845 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009846 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009847 {
9848 return gl::error(GL_OUT_OF_MEMORY);
9849 }
9850}
9851
Shannon Woodsb3801742014-03-27 14:59:19 -04009852void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9853{
9854 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9855
9856 try
9857 {
9858 gl::Context *context = gl::getNonLostContext();
9859
9860 if (context)
9861 {
Shannon Woodsb3801742014-03-27 14:59:19 -04009862 if (!gl::ValidBufferTarget(context, target))
9863 {
9864 return gl::error(GL_INVALID_ENUM);
9865 }
9866
9867 if (pname != GL_BUFFER_MAP_POINTER)
9868 {
9869 return gl::error(GL_INVALID_ENUM);
9870 }
9871
9872 gl::Buffer *buffer = context->getTargetBuffer(target);
9873
9874 if (!buffer || !buffer->mapped())
9875 {
9876 *params = NULL;
9877 }
9878
9879 *params = buffer->mapPointer();
9880 }
9881 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009882 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009883 {
9884 return gl::error(GL_OUT_OF_MEMORY);
9885 }
9886}
9887
9888void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9889{
9890 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9891
9892 try
9893 {
9894 gl::Context *context = gl::getNonLostContext();
9895
9896 if (context)
9897 {
9898 if (!gl::ValidBufferTarget(context, target))
9899 {
9900 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9901 }
9902
9903 gl::Buffer *buffer = context->getTargetBuffer(target);
9904
9905 if (buffer == NULL)
9906 {
9907 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9908 }
9909
9910 if (access != GL_WRITE_ONLY_OES)
9911 {
9912 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9913 }
9914
9915 if (buffer->mapped())
9916 {
9917 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9918 }
9919
9920 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
9921 }
9922 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009923 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009924 {
9925 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
9926 }
9927
9928 return NULL;
9929}
9930
9931GLboolean __stdcall glUnmapBufferOES(GLenum target)
9932{
9933 EVENT("(GLenum target = 0x%X)", target);
9934
9935 try
9936 {
9937 gl::Context *context = gl::getNonLostContext();
9938
9939 if (context)
9940 {
9941 if (!gl::ValidBufferTarget(context, target))
9942 {
9943 return gl::error(GL_INVALID_ENUM, GL_FALSE);
9944 }
9945
9946 gl::Buffer *buffer = context->getTargetBuffer(target);
9947
9948 if (buffer == NULL || !buffer->mapped())
9949 {
9950 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9951 }
9952
9953 // TODO: detect if we had corruption. if so, throw an error and return false.
9954
9955 buffer->unmap();
9956
9957 return GL_TRUE;
9958 }
9959 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009960 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009961 {
9962 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9963 }
9964
9965 return GL_FALSE;
9966}
9967
Shannon Woods916e7692014-03-27 16:58:22 -04009968void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
9969{
9970 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
9971 target, offset, length, access);
9972
9973 try
9974 {
9975 gl::Context *context = gl::getNonLostContext();
9976
9977 if (context)
9978 {
9979 if (!gl::ValidBufferTarget(context, target))
9980 {
9981 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
9982 }
9983
9984 if (offset < 0 || length < 0)
9985 {
9986 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
9987 }
9988
9989 gl::Buffer *buffer = context->getTargetBuffer(target);
9990
9991 if (buffer == NULL)
9992 {
9993 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
9994 }
9995
9996 // Check for buffer overflow
9997 size_t offsetSize = static_cast<size_t>(offset);
9998 size_t lengthSize = static_cast<size_t>(length);
9999
10000 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10001 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10002 {
10003 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10004 }
10005
10006 // Check for invalid bits in the mask
10007 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10008 GL_MAP_WRITE_BIT |
10009 GL_MAP_INVALIDATE_RANGE_BIT |
10010 GL_MAP_INVALIDATE_BUFFER_BIT |
10011 GL_MAP_FLUSH_EXPLICIT_BIT |
10012 GL_MAP_UNSYNCHRONIZED_BIT;
10013
10014 if (access & ~(allAccessBits))
10015 {
10016 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10017 }
10018
10019 if (length == 0 || buffer->mapped())
10020 {
10021 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10022 }
10023
10024 // Check for invalid bit combinations
10025 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10026 {
10027 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10028 }
10029
10030 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10031 GL_MAP_INVALIDATE_BUFFER_BIT |
10032 GL_MAP_UNSYNCHRONIZED_BIT;
10033
10034 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10035 {
10036 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10037 }
10038
10039 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10040 {
10041 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10042 }
10043
10044 return buffer->mapRange(offset, length, access);
10045 }
10046 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010047 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010048 {
10049 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10050 }
10051
10052 return NULL;
10053}
10054
10055void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10056{
10057 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10058
10059 try
10060 {
10061 gl::Context *context = gl::getNonLostContext();
10062
10063 if (context)
10064 {
10065 if (offset < 0 || length < 0)
10066 {
10067 return gl::error(GL_INVALID_VALUE);
10068 }
10069
10070 if (!gl::ValidBufferTarget(context, target))
10071 {
10072 return gl::error(GL_INVALID_ENUM);
10073 }
10074
10075 gl::Buffer *buffer = context->getTargetBuffer(target);
10076
10077 if (buffer == NULL)
10078 {
10079 return gl::error(GL_INVALID_OPERATION);
10080 }
10081
10082 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10083 {
10084 return gl::error(GL_INVALID_OPERATION);
10085 }
10086
10087 // Check for buffer overflow
10088 size_t offsetSize = static_cast<size_t>(offset);
10089 size_t lengthSize = static_cast<size_t>(length);
10090
10091 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10092 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10093 {
10094 return gl::error(GL_INVALID_VALUE);
10095 }
10096
10097 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10098 }
10099 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010100 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010101 {
10102 return gl::error(GL_OUT_OF_MEMORY);
10103 }
10104}
10105
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010106__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10107{
10108 struct Extension
10109 {
10110 const char *name;
10111 __eglMustCastToProperFunctionPointerType address;
10112 };
10113
10114 static const Extension glExtensions[] =
10115 {
10116 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010117 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010118 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010119 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10120 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10121 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10122 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10123 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10124 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10125 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010126 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010127 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010128 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10129 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10130 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10131 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010132 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10133 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10134 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10135 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10136 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10137 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10138 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010139 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010140 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10141 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10142 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010143 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010144 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10145 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10146 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010147 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10148 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10149 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010150
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010151 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010152 {
10153 if (strcmp(procname, glExtensions[ext].name) == 0)
10154 {
10155 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10156 }
10157 }
10158
10159 return NULL;
10160}
10161
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010162// Non-public functions used by EGL
10163
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010164bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010165{
10166 EVENT("(egl::Surface* surface = 0x%0.8p)",
10167 surface);
10168
10169 try
10170 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010171 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010172
10173 if (context)
10174 {
10175 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010176 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010177
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010178 if (textureObject->isImmutable())
10179 {
10180 return false;
10181 }
10182
Geoff Lang32d508e2014-02-11 09:39:48 -050010183 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010184 }
10185 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010186 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010188 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010189 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010190
10191 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010192}
10193
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010194}