blob: 85afdd364f96d6d5b7dd9cfa53b7692fb66f5e90 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
Jamie Madill57a89722013-07-02 11:57:03 -040024#include "libGLESv2/VertexArray.h"
Geoff Langc8058452014-02-03 12:04:11 -050025#include "libGLESv2/TransformFeedback.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
Geoff Lange8ebe7f2013-08-05 15:03:13 -040027#include "libGLESv2/validationES.h"
28#include "libGLESv2/validationES2.h"
29#include "libGLESv2/validationES3.h"
Jamie Madill55856b12014-01-02 13:59:50 -050030#include "libGLESv2/queryconversions.h"
Jamie Madill478fdb22013-07-19 16:36:59 -040031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032extern "C"
33{
34
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000035// OpenGL ES 2.0 functions
36
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037void __stdcall glActiveTexture(GLenum texture)
38{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000039 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040
41 try
42 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000043 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044
45 if (context)
46 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000047 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
48 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +000050 }
51
daniel@transgaming.com428d1582010-05-04 03:35:25 +000052 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 }
54 }
Jamie Madillde0ec752014-05-05 15:10:38 -040055 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058 }
59}
60
61void __stdcall glAttachShader(GLuint program, GLuint shader)
62{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000063 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064
65 try
66 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068
69 if (context)
70 {
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000074 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000076 if (context->getShader(program))
77 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000079 }
80 else
81 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000083 }
84 }
85
86 if (!shaderObject)
87 {
88 if (context->getProgram(shader))
89 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000091 }
92 else
93 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 }
97
98 if (!programObject->attachShader(shaderObject))
99 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 }
102 }
103 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400104 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
108}
109
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000110void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
111{
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
113
114 try
115 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000116 gl::Context *context = gl::getNonLostContext();
117
118 if (context)
119 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400120 if (!ValidateBeginQuery(context, target, id))
Geoff Lang37dde692014-01-31 16:34:54 -0500121 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400122 return;
Geoff Lang37dde692014-01-31 16:34:54 -0500123 }
124
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000125 context->beginQuery(target, id);
126 }
127 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400128 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000131 }
132}
133
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000134void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000136 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
138 try
139 {
140 if (index >= gl::MAX_VERTEX_ATTRIBS)
141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143 }
144
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000145 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146
147 if (context)
148 {
149 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000150
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 if (!programObject)
152 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000153 if (context->getShader(program))
154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000156 }
157 else
158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000160 }
161 }
162
163 if (strncmp(name, "gl_", 3) == 0)
164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000165 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166 }
167
168 programObject->bindAttributeLocation(index, name);
169 }
170 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400171 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 }
175}
176
177void __stdcall glBindBuffer(GLenum target, GLuint buffer)
178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000179 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180
181 try
182 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184
185 if (context)
186 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500187 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000188 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500189 return gl::error(GL_INVALID_ENUM);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000190 }
191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000192 switch (target)
193 {
194 case GL_ARRAY_BUFFER:
195 context->bindArrayBuffer(buffer);
196 return;
197 case GL_ELEMENT_ARRAY_BUFFER:
198 context->bindElementArrayBuffer(buffer);
199 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000200 case GL_COPY_READ_BUFFER:
201 context->bindCopyReadBuffer(buffer);
202 return;
203 case GL_COPY_WRITE_BUFFER:
204 context->bindCopyWriteBuffer(buffer);
205 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000206 case GL_PIXEL_PACK_BUFFER:
207 context->bindPixelPackBuffer(buffer);
208 return;
209 case GL_PIXEL_UNPACK_BUFFER:
210 context->bindPixelUnpackBuffer(buffer);
211 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000212 case GL_UNIFORM_BUFFER:
213 context->bindGenericUniformBuffer(buffer);
214 return;
215 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000216 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000217 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 }
221 }
222 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400223 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 }
227}
228
229void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000231 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000232
233 try
234 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500235 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238 }
239
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241
242 if (context)
243 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000244 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
245 {
246 context->bindReadFramebuffer(framebuffer);
247 }
248
249 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
250 {
251 context->bindDrawFramebuffer(framebuffer);
252 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 }
254 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400255 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000257 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 }
259}
260
261void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000263 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
267 if (target != GL_RENDERBUFFER)
268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000269 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270 }
271
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273
274 if (context)
275 {
276 context->bindRenderbuffer(renderbuffer);
277 }
278 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400279 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 }
283}
284
285void __stdcall glBindTexture(GLenum target, GLuint texture)
286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000287 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288
289 try
290 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000291 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292
293 if (context)
294 {
295 gl::Texture *textureObject = context->getTexture(texture);
296
297 if (textureObject && textureObject->getTarget() != target && texture != 0)
298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300 }
301
302 switch (target)
303 {
304 case GL_TEXTURE_2D:
305 context->bindTexture2D(texture);
306 return;
307 case GL_TEXTURE_CUBE_MAP:
308 context->bindTextureCubeMap(texture);
309 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000310 case GL_TEXTURE_3D:
311 if (context->getClientVersion() < 3)
312 {
313 return gl::error(GL_INVALID_ENUM);
314 }
315 context->bindTexture3D(texture);
316 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000317 case GL_TEXTURE_2D_ARRAY:
318 if (context->getClientVersion() < 3)
319 {
320 return gl::error(GL_INVALID_ENUM);
321 }
322 context->bindTexture2DArray(texture);
323 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326 }
327 }
328 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400329 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 }
333}
334
335void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000337 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000338 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339
340 try
341 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000342 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000343
344 if (context)
345 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000346 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000347 }
348 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400349 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352 }
353}
354
355void __stdcall glBlendEquation(GLenum mode)
356{
357 glBlendEquationSeparate(mode, mode);
358}
359
360void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000362 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000363
364 try
365 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000366 gl::Context *context = gl::getNonLostContext();
367
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368 switch (modeRGB)
369 {
370 case GL_FUNC_ADD:
371 case GL_FUNC_SUBTRACT:
372 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000373 case GL_MIN:
374 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000375 break;
376
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000378 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000379 }
380
381 switch (modeAlpha)
382 {
383 case GL_FUNC_ADD:
384 case GL_FUNC_SUBTRACT:
385 case GL_FUNC_REVERSE_SUBTRACT:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000386 case GL_MIN:
387 case GL_MAX:
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000388 break;
389
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392 }
393
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394 if (context)
395 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000396 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400399 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000401 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 }
403}
404
405void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
406{
407 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
408}
409
410void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000412 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000413 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000414
415 try
416 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000417 gl::Context *context = gl::getNonLostContext();
418
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000419 switch (srcRGB)
420 {
421 case GL_ZERO:
422 case GL_ONE:
423 case GL_SRC_COLOR:
424 case GL_ONE_MINUS_SRC_COLOR:
425 case GL_DST_COLOR:
426 case GL_ONE_MINUS_DST_COLOR:
427 case GL_SRC_ALPHA:
428 case GL_ONE_MINUS_SRC_ALPHA:
429 case GL_DST_ALPHA:
430 case GL_ONE_MINUS_DST_ALPHA:
431 case GL_CONSTANT_COLOR:
432 case GL_ONE_MINUS_CONSTANT_COLOR:
433 case GL_CONSTANT_ALPHA:
434 case GL_ONE_MINUS_CONSTANT_ALPHA:
435 case GL_SRC_ALPHA_SATURATE:
436 break;
437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000439 }
440
441 switch (dstRGB)
442 {
443 case GL_ZERO:
444 case GL_ONE:
445 case GL_SRC_COLOR:
446 case GL_ONE_MINUS_SRC_COLOR:
447 case GL_DST_COLOR:
448 case GL_ONE_MINUS_DST_COLOR:
449 case GL_SRC_ALPHA:
450 case GL_ONE_MINUS_SRC_ALPHA:
451 case GL_DST_ALPHA:
452 case GL_ONE_MINUS_DST_ALPHA:
453 case GL_CONSTANT_COLOR:
454 case GL_ONE_MINUS_CONSTANT_COLOR:
455 case GL_CONSTANT_ALPHA:
456 case GL_ONE_MINUS_CONSTANT_ALPHA:
457 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000458
459 case GL_SRC_ALPHA_SATURATE:
460 if (!context || context->getClientVersion() < 3)
461 {
462 return gl::error(GL_INVALID_ENUM);
463 }
464 break;
465
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468 }
469
470 switch (srcAlpha)
471 {
472 case GL_ZERO:
473 case GL_ONE:
474 case GL_SRC_COLOR:
475 case GL_ONE_MINUS_SRC_COLOR:
476 case GL_DST_COLOR:
477 case GL_ONE_MINUS_DST_COLOR:
478 case GL_SRC_ALPHA:
479 case GL_ONE_MINUS_SRC_ALPHA:
480 case GL_DST_ALPHA:
481 case GL_ONE_MINUS_DST_ALPHA:
482 case GL_CONSTANT_COLOR:
483 case GL_ONE_MINUS_CONSTANT_COLOR:
484 case GL_CONSTANT_ALPHA:
485 case GL_ONE_MINUS_CONSTANT_ALPHA:
486 case GL_SRC_ALPHA_SATURATE:
487 break;
488 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 }
491
492 switch (dstAlpha)
493 {
494 case GL_ZERO:
495 case GL_ONE:
496 case GL_SRC_COLOR:
497 case GL_ONE_MINUS_SRC_COLOR:
498 case GL_DST_COLOR:
499 case GL_ONE_MINUS_DST_COLOR:
500 case GL_SRC_ALPHA:
501 case GL_ONE_MINUS_SRC_ALPHA:
502 case GL_DST_ALPHA:
503 case GL_ONE_MINUS_DST_ALPHA:
504 case GL_CONSTANT_COLOR:
505 case GL_ONE_MINUS_CONSTANT_COLOR:
506 case GL_CONSTANT_ALPHA:
507 case GL_ONE_MINUS_CONSTANT_ALPHA:
508 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +0000509
510 case GL_SRC_ALPHA_SATURATE:
511 if (!context || context->getClientVersion() < 3)
512 {
513 return gl::error(GL_INVALID_ENUM);
514 }
515 break;
516
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000518 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519 }
520
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000521 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
522 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
523
524 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
525 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
526
527 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000528 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000529 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000530 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000531 }
532
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533 if (context)
534 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000535 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536 }
537 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400538 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000540 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542}
543
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000544void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000545{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000546 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000547 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000548
549 try
550 {
551 if (size < 0)
552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000553 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000554 }
555
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000556 gl::Context *context = gl::getNonLostContext();
557
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000558 switch (usage)
559 {
560 case GL_STREAM_DRAW:
561 case GL_STATIC_DRAW:
562 case GL_DYNAMIC_DRAW:
563 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +0000564
565 case GL_STREAM_READ:
566 case GL_STREAM_COPY:
567 case GL_STATIC_READ:
568 case GL_STATIC_COPY:
569 case GL_DYNAMIC_READ:
570 case GL_DYNAMIC_COPY:
571 if (context && context->getClientVersion() < 3)
572 {
573 return gl::error(GL_INVALID_ENUM);
574 }
575 break;
576
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579 }
580
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 if (context)
582 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500583 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 }
587
Jamie Madill8c96d582014-03-05 15:01:23 -0500588 gl::Buffer *buffer = context->getTargetBuffer(target);
589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000590 if (!buffer)
591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000592 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000593 }
594
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000595 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596 }
597 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400598 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000600 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601 }
602}
603
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000604void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000606 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000607 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000608
609 try
610 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000611 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000614 }
615
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000616 if (data == NULL)
617 {
618 return;
619 }
620
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000621 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000622
623 if (context)
624 {
Jamie Madill8c96d582014-03-05 15:01:23 -0500625 if (!gl::ValidBufferTarget(context, target))
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000628 }
629
Jamie Madill8c96d582014-03-05 15:01:23 -0500630 gl::Buffer *buffer = context->getTargetBuffer(target);
631
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000632 if (!buffer)
633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000635 }
636
Jamie Madill7a5f7382014-03-05 15:01:24 -0500637 if (buffer->mapped())
638 {
639 return gl::error(GL_INVALID_OPERATION);
640 }
641
Geoff Lang876dc722014-05-01 17:10:24 -0400642 // Check for possible overflow of size + offset
643 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
644 {
645 return gl::error(GL_OUT_OF_MEMORY);
646 }
647
648 if (size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000650 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000651 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000652
653 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000654 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000655 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400656 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000659 }
660}
661
662GLenum __stdcall glCheckFramebufferStatus(GLenum target)
663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000664 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000665
666 try
667 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500668 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000670 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 }
672
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000673 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674
675 if (context)
676 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500677 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
678 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000679 return framebuffer->completeness();
680 }
681 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400682 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000684 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000685 }
686
687 return 0;
688}
689
690void __stdcall glClear(GLbitfield mask)
691{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000692 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693
694 try
695 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000696 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000697
698 if (context)
699 {
Geoff Lang0b833232013-08-21 10:13:29 -0400700 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
701
702 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
703 {
704 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
705 }
706
707 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
708 {
709 return gl::error(GL_INVALID_VALUE);
710 }
711
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000712 context->clear(mask);
713 }
714 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400715 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000718 }
719}
720
721void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000723 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000724 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000725
726 try
727 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729
730 if (context)
731 {
732 context->setClearColor(red, green, blue, alpha);
733 }
734 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400735 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 }
739}
740
741void __stdcall glClearDepthf(GLclampf depth)
742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000743 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000744
745 try
746 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748
749 if (context)
750 {
751 context->setClearDepth(depth);
752 }
753 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400754 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 }
758}
759
760void __stdcall glClearStencil(GLint s)
761{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000762 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763
764 try
765 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000766 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767
768 if (context)
769 {
770 context->setClearStencil(s);
771 }
772 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400773 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 }
777}
778
779void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
780{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000781 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000782 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783
784 try
785 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787
788 if (context)
789 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000790 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000791 }
792 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400793 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000796 }
797}
798
799void __stdcall glCompileShader(GLuint shader)
800{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000801 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802
803 try
804 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000806
807 if (context)
808 {
809 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 if (!shaderObject)
812 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000813 if (context->getProgram(shader))
814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000815 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000816 }
817 else
818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000819 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821 }
822
823 shaderObject->compile();
824 }
825 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400826 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000828 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000829 }
830}
831
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000832void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
833 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000836 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000837 target, level, internalformat, width, height, border, imageSize, data);
838
839 try
840 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000841 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000842
843 if (context)
844 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000845 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400846 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000847 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
848 {
849 return;
850 }
851
852 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400853 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400854 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000855 {
856 return;
857 }
858
859 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000862 }
863
864 switch (target)
865 {
866 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000867 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000868 gl::Texture2D *texture = context->getTexture2D();
869 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000870 }
871 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000872
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000873 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
874 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
875 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000879 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000880 gl::TextureCubeMap *texture = context->getTextureCubeMap();
881 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000882 }
883 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000884
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000885 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000886 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000887 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000889 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400890 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000893 }
894}
895
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000896void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
897 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000899 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000900 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000901 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902 target, level, xoffset, yoffset, width, height, format, imageSize, data);
903
904 try
905 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000906 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000907
908 if (context)
909 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000910 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400911 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000912 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
913 {
914 return;
915 }
916
917 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400918 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -0400919 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000920 {
921 return;
922 }
923
924 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000927 }
928
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000929 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000930 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000931 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000932 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000933 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000934 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000935 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000936 break;
937
938 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
939 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
940 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
942 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
943 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000944 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000945 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000946 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000947 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000948 break;
949
950 default:
951 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000952 }
953 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954 }
Jamie Madillde0ec752014-05-05 15:10:38 -0400955 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000957 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 }
959}
960
961void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
962{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000963 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000964 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000965 target, level, internalformat, x, y, width, height, border);
966
967 try
968 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000969 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000970
971 if (context)
972 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000973 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400974 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000975 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000976 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000977 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +0000978 }
979
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -0400981 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000982 0, 0, 0, x, y, width, height, border))
983 {
984 return;
985 }
986
987 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
988
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000989 switch (target)
990 {
991 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000992 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000993 gl::Texture2D *texture = context->getTexture2D();
994 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000995 }
996 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000997
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000998 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
999 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1000 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1002 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1003 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001004 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001005 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1006 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001007 }
1008 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001009
1010 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001011 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001012 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001015 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 }
1019}
1020
1021void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001023 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001024 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025 target, level, xoffset, yoffset, x, y, width, height);
1026
1027 try
1028 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001030
1031 if (context)
1032 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001033 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001034 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001035 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001036 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001037 return;
1038 }
1039
1040 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001041 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001042 xoffset, yoffset, 0, x, y, width, height, 0))
1043 {
1044 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001045 }
1046
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001047 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001048
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001049 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001050 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001051 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001052 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001053 gl::Texture2D *texture = context->getTexture2D();
1054 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001055 }
1056 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001057
1058 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1060 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001064 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001065 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1066 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001067 }
1068 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001069
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001070 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001071 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001072 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001073 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001074 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001075
Jamie Madillde0ec752014-05-05 15:10:38 -04001076 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001079 }
1080}
1081
1082GLuint __stdcall glCreateProgram(void)
1083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001084 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001085
1086 try
1087 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089
1090 if (context)
1091 {
1092 return context->createProgram();
1093 }
1094 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001095 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001097 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001098 }
1099
1100 return 0;
1101}
1102
1103GLuint __stdcall glCreateShader(GLenum type)
1104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001105 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001106
1107 try
1108 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001109 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001110
1111 if (context)
1112 {
1113 switch (type)
1114 {
1115 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001116 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001117 return context->createShader(type);
1118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001120 }
1121 }
1122 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001123 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001125 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 }
1127
1128 return 0;
1129}
1130
1131void __stdcall glCullFace(GLenum mode)
1132{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001133 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134
1135 try
1136 {
1137 switch (mode)
1138 {
1139 case GL_FRONT:
1140 case GL_BACK:
1141 case GL_FRONT_AND_BACK:
1142 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144
1145 if (context)
1146 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001147 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001148 }
1149 }
1150 break;
1151 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001152 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 }
1154 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001155 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 }
1159}
1160
1161void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001163 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001164
1165 try
1166 {
1167 if (n < 0)
1168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001170 }
1171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173
1174 if (context)
1175 {
1176 for (int i = 0; i < n; i++)
1177 {
1178 context->deleteBuffer(buffers[i]);
1179 }
1180 }
1181 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001182 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 }
1186}
1187
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001188void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001190 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001191
1192 try
1193 {
1194 if (n < 0)
1195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001196 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001197 }
1198
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001199 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001200
1201 if (context)
1202 {
1203 for (int i = 0; i < n; i++)
1204 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001205 context->deleteFenceNV(fences[i]);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001206 }
1207 }
1208 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001209 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001211 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001212 }
1213}
1214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001215void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001217 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001218
1219 try
1220 {
1221 if (n < 0)
1222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001223 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001224 }
1225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001227
1228 if (context)
1229 {
1230 for (int i = 0; i < n; i++)
1231 {
1232 if (framebuffers[i] != 0)
1233 {
1234 context->deleteFramebuffer(framebuffers[i]);
1235 }
1236 }
1237 }
1238 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001239 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001241 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243}
1244
1245void __stdcall glDeleteProgram(GLuint program)
1246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001247 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248
1249 try
1250 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001251 if (program == 0)
1252 {
1253 return;
1254 }
1255
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257
1258 if (context)
1259 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001260 if (!context->getProgram(program))
1261 {
1262 if(context->getShader(program))
1263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001265 }
1266 else
1267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001269 }
1270 }
1271
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001272 context->deleteProgram(program);
1273 }
1274 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001275 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 }
1279}
1280
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001281void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1282{
1283 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1284
1285 try
1286 {
1287 if (n < 0)
1288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001290 }
1291
1292 gl::Context *context = gl::getNonLostContext();
1293
1294 if (context)
1295 {
1296 for (int i = 0; i < n; i++)
1297 {
1298 context->deleteQuery(ids[i]);
1299 }
1300 }
1301 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001302 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001304 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001305 }
1306}
1307
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1309{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001310 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001311
1312 try
1313 {
1314 if (n < 0)
1315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001317 }
1318
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001319 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001320
1321 if (context)
1322 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001323 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001324 {
1325 context->deleteRenderbuffer(renderbuffers[i]);
1326 }
1327 }
1328 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001329 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 }
1333}
1334
1335void __stdcall glDeleteShader(GLuint shader)
1336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001337 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338
1339 try
1340 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001341 if (shader == 0)
1342 {
1343 return;
1344 }
1345
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001346 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347
1348 if (context)
1349 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001350 if (!context->getShader(shader))
1351 {
1352 if(context->getProgram(shader))
1353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001354 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001355 }
1356 else
1357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001358 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001359 }
1360 }
1361
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001362 context->deleteShader(shader);
1363 }
1364 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001365 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001368 }
1369}
1370
1371void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001373 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001374
1375 try
1376 {
1377 if (n < 0)
1378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001380 }
1381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001383
1384 if (context)
1385 {
1386 for (int i = 0; i < n; i++)
1387 {
1388 if (textures[i] != 0)
1389 {
1390 context->deleteTexture(textures[i]);
1391 }
1392 }
1393 }
1394 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001395 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398 }
1399}
1400
1401void __stdcall glDepthFunc(GLenum func)
1402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001403 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001404
1405 try
1406 {
1407 switch (func)
1408 {
1409 case GL_NEVER:
1410 case GL_ALWAYS:
1411 case GL_LESS:
1412 case GL_LEQUAL:
1413 case GL_EQUAL:
1414 case GL_GREATER:
1415 case GL_GEQUAL:
1416 case GL_NOTEQUAL:
1417 break;
1418 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420 }
1421
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001422 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001423
1424 if (context)
1425 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001426 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427 }
1428 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001429 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 }
1433}
1434
1435void __stdcall glDepthMask(GLboolean flag)
1436{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001437 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001438
1439 try
1440 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442
1443 if (context)
1444 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001445 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446 }
1447 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001448 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001451 }
1452}
1453
1454void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1455{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001456 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001457
1458 try
1459 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001460 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461
1462 if (context)
1463 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001464 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465 }
1466 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001467 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001469 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470 }
1471}
1472
1473void __stdcall glDetachShader(GLuint program, GLuint shader)
1474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001475 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001476
1477 try
1478 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001480
1481 if (context)
1482 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 gl::Program *programObject = context->getProgram(program);
1485 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001486
1487 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001488 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001489 gl::Shader *shaderByProgramHandle;
1490 shaderByProgramHandle = context->getShader(program);
1491 if (!shaderByProgramHandle)
1492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001494 }
1495 else
1496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001498 }
1499 }
1500
1501 if (!shaderObject)
1502 {
1503 gl::Program *programByShaderHandle = context->getProgram(shader);
1504 if (!programByShaderHandle)
1505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001506 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001507 }
1508 else
1509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001511 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001512 }
1513
1514 if (!programObject->detachShader(shaderObject))
1515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518 }
1519 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001520 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001522 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 }
1524}
1525
1526void __stdcall glDisable(GLenum cap)
1527{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001528 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001529
1530 try
1531 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001532 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533
1534 if (context)
1535 {
Geoff Lang0550d032014-01-30 11:29:07 -05001536 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539 }
Geoff Lang0550d032014-01-30 11:29:07 -05001540
1541 context->setCap(cap, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001542 }
1543 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001544 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547 }
1548}
1549
1550void __stdcall glDisableVertexAttribArray(GLuint index)
1551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001552 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553
1554 try
1555 {
1556 if (index >= gl::MAX_VERTEX_ATTRIBS)
1557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559 }
1560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562
1563 if (context)
1564 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001565 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566 }
1567 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001568 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 }
1572}
1573
1574void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001576 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577
1578 try
1579 {
1580 if (count < 0 || first < 0)
1581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001582 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583 }
1584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586
Jamie Madill7a5f7382014-03-05 15:01:24 -05001587 // Check for mapped buffers
1588 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1589 {
1590 return gl::error(GL_INVALID_OPERATION);
1591 }
1592
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 if (context)
1594 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001595 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1596 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1597 curTransformFeedback->getDrawMode() != mode)
1598 {
1599 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1600 // that does not match the current transform feedback object's draw mode (if transform feedback
1601 // is active), (3.0.2, section 2.14, pg 86)
1602 return gl::error(GL_INVALID_OPERATION);
1603 }
1604
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001605 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001606 }
1607 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001608 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001610 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611 }
1612}
1613
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001614void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1615{
1616 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1617
1618 try
1619 {
1620 if (count < 0 || first < 0 || primcount < 0)
1621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001623 }
1624
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001625 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001626 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001627 gl::Context *context = gl::getNonLostContext();
1628
Jamie Madill7a5f7382014-03-05 15:01:24 -05001629 // Check for mapped buffers
1630 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1631 {
1632 return gl::error(GL_INVALID_OPERATION);
1633 }
1634
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001635 if (context)
1636 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001637 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1638 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1639 curTransformFeedback->getDrawMode() != mode)
1640 {
1641 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1642 // that does not match the current transform feedback object's draw mode (if transform feedback
1643 // is active), (3.0.2, section 2.14, pg 86)
1644 return gl::error(GL_INVALID_OPERATION);
1645 }
1646
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001647 context->drawArrays(mode, first, count, primcount);
1648 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001649 }
1650 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001651 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001654 }
1655}
1656
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001657void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001659 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001660 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661
1662 try
1663 {
1664 if (count < 0)
1665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001667 }
1668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670
1671 if (context)
1672 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001673 switch (type)
1674 {
1675 case GL_UNSIGNED_BYTE:
1676 case GL_UNSIGNED_SHORT:
1677 break;
1678 case GL_UNSIGNED_INT:
1679 if (!context->supports32bitIndices())
1680 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001682 }
1683 break;
1684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00001686 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001687
1688 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1689 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1690 {
1691 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1692 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1693 return gl::error(GL_INVALID_OPERATION);
1694 }
1695
Jamie Madill7a5f7382014-03-05 15:01:24 -05001696 // Check for mapped buffers
1697 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1698 {
1699 return gl::error(GL_INVALID_OPERATION);
1700 }
1701
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001702 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001703 }
1704 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001705 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001707 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001708 }
1709}
1710
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001711void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1712{
1713 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1714 mode, count, type, indices, primcount);
1715
1716 try
1717 {
1718 if (count < 0 || primcount < 0)
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001721 }
1722
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001723 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001724 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001725 gl::Context *context = gl::getNonLostContext();
1726
1727 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001728 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001729 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001730 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001731 case GL_UNSIGNED_BYTE:
1732 case GL_UNSIGNED_SHORT:
1733 break;
1734 case GL_UNSIGNED_INT:
1735 if (!context->supports32bitIndices())
1736 {
Geoff Langeeba6e12014-02-03 13:12:30 -05001737 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001738 }
1739 break;
1740 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001741 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001742 }
Geoff Langeeba6e12014-02-03 13:12:30 -05001743
1744 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1745 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1746 {
1747 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1748 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1749 return gl::error(GL_INVALID_OPERATION);
1750 }
1751
Jamie Madill7a5f7382014-03-05 15:01:24 -05001752 // Check for mapped buffers
1753 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1754 {
1755 return gl::error(GL_INVALID_OPERATION);
1756 }
1757
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001758 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001759 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001760 }
1761 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001762 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001764 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001765 }
1766}
1767
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768void __stdcall glEnable(GLenum cap)
1769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001770 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001771
1772 try
1773 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775
1776 if (context)
1777 {
Geoff Lang0550d032014-01-30 11:29:07 -05001778 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001780 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001781 }
Geoff Lang0550d032014-01-30 11:29:07 -05001782
1783 context->setCap(cap, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784 }
1785 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001786 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001789 }
1790}
1791
1792void __stdcall glEnableVertexAttribArray(GLuint index)
1793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001794 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795
1796 try
1797 {
1798 if (index >= gl::MAX_VERTEX_ATTRIBS)
1799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001801 }
1802
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001803 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001804
1805 if (context)
1806 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001807 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001808 }
1809 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001810 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813 }
1814}
1815
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001816void __stdcall glEndQueryEXT(GLenum target)
1817{
1818 EVENT("GLenum target = 0x%X)", target);
1819
1820 try
1821 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001822 gl::Context *context = gl::getNonLostContext();
1823
1824 if (context)
1825 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001826 if (!ValidateEndQuery(context, target))
Geoff Lang37dde692014-01-31 16:34:54 -05001827 {
Jamie Madill45c785d2014-05-13 14:09:34 -04001828 return;
Geoff Lang37dde692014-01-31 16:34:54 -05001829 }
1830
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001831 context->endQuery(target);
1832 }
1833 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001834 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001837 }
1838}
1839
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001840void __stdcall glFinishFenceNV(GLuint fence)
1841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001842 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001843
1844 try
1845 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001846 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001847
1848 if (context)
1849 {
Jamie Madill33dc8432013-07-26 11:55:05 -04001850 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001851
1852 if (fenceObject == NULL)
1853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001854 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001855 }
1856
Jamie Madillfb9a7402013-07-26 11:55:01 -04001857 if (fenceObject->isFence() != GL_TRUE)
1858 {
1859 return gl::error(GL_INVALID_OPERATION);
1860 }
1861
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001862 fenceObject->finishFence();
1863 }
1864 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001865 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001867 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001868 }
1869}
1870
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001871void __stdcall glFinish(void)
1872{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001873 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001874
1875 try
1876 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878
1879 if (context)
1880 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001881 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882 }
1883 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001884 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001886 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001887 }
1888}
1889
1890void __stdcall glFlush(void)
1891{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001892 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893
1894 try
1895 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001896 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897
1898 if (context)
1899 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00001900 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001901 }
1902 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001903 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906 }
1907}
1908
1909void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001911 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001912 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001913
1914 try
1915 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001916 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001918 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919 }
1920
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001921 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922
1923 if (context)
1924 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001925 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001926 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001927 return;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001928 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001929
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001930 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1931 ASSERT(framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001932
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001933 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001935 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001936 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001937 }
1938 else
1939 {
1940 switch (attachment)
1941 {
1942 case GL_DEPTH_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001943 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001944 break;
1945 case GL_STENCIL_ATTACHMENT:
Geoff Lang309c92a2013-07-25 16:23:19 -04001946 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001947 break;
Geoff Lang7e9ee232013-08-05 10:18:42 -04001948 case GL_DEPTH_STENCIL_ATTACHMENT:
Geoff Lang7e9ee232013-08-05 10:18:42 -04001949 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1950 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001951 default:
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001952 UNREACHABLE();
1953 break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001954 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955 }
1956 }
1957 }
Jamie Madillde0ec752014-05-05 15:10:38 -04001958 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001961 }
1962}
1963
1964void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001966 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001967 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968
1969 try
1970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 if (context)
1973 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001974 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001975 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001976 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001977 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001978 }
Geoff Lang3ed0c482013-07-25 17:03:18 -04001979
1980 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04001981 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001982 {
Geoff Lang3ed0c482013-07-25 17:03:18 -04001983 return;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001984 }
1985
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001986 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001987 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001988 textarget = GL_NONE;
1989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001991 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001993 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001994 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001995 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
Geoff Lang309c92a2013-07-25 16:23:19 -04001996 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001997 }
1998 else
1999 {
2000 switch (attachment)
2001 {
Geoff Lang309c92a2013-07-25 16:23:19 -04002002 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2003 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2004 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002005 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002006 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007 }
2008 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002009 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002012 }
2013}
2014
2015void __stdcall glFrontFace(GLenum mode)
2016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002017 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018
2019 try
2020 {
2021 switch (mode)
2022 {
2023 case GL_CW:
2024 case GL_CCW:
2025 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002026 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027
2028 if (context)
2029 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002030 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 }
2032 }
2033 break;
2034 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 }
2037 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002038 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002040 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041 }
2042}
2043
2044void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002046 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047
2048 try
2049 {
2050 if (n < 0)
2051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002052 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002055 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056
2057 if (context)
2058 {
2059 for (int i = 0; i < n; i++)
2060 {
2061 buffers[i] = context->createBuffer();
2062 }
2063 }
2064 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002065 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069}
2070
2071void __stdcall glGenerateMipmap(GLenum target)
2072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002073 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074
2075 try
2076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002078
2079 if (context)
2080 {
Jamie Madill35d15012013-10-07 10:46:37 -04002081 if (!ValidTextureTarget(context, target))
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002084 }
Geoff Langae4852a2013-06-05 15:00:34 -04002085
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002086 gl::Texture *texture = context->getTargetTexture(target);
Jamie Madill35d15012013-10-07 10:46:37 -04002087
2088 if (texture == NULL)
Geoff Langae4852a2013-06-05 15:00:34 -04002089 {
2090 return gl::error(GL_INVALID_OPERATION);
2091 }
2092
Geoff Lang005df412013-10-16 14:12:50 -04002093 GLenum internalFormat = texture->getBaseLevelInternalFormat();
Jamie Madill35d15012013-10-07 10:46:37 -04002094
Geoff Langae4852a2013-06-05 15:00:34 -04002095 // Internally, all texture formats are sized so checking if the format
2096 // is color renderable and filterable will not fail.
Jamie Madill61b54432014-02-18 15:27:19 -05002097
2098 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2099 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2100
Jamie Madill33f9c2e2013-10-07 10:46:36 -04002101 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2102 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
Jamie Madill61b54432014-02-18 15:27:19 -05002103 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2104 !validRenderable)
Geoff Langae4852a2013-06-05 15:00:34 -04002105 {
2106 return gl::error(GL_INVALID_OPERATION);
2107 }
2108
Jamie Madillc1f8b162013-10-07 10:46:38 -04002109 // Non-power of 2 ES2 check
2110 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2111 {
2112 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2113 return gl::error(GL_INVALID_OPERATION);
2114 }
2115
2116 // Cube completeness check
2117 if (target == GL_TEXTURE_CUBE_MAP)
2118 {
2119 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2120 if (!textureCube->isCubeComplete())
2121 {
2122 return gl::error(GL_INVALID_OPERATION);
2123 }
2124 }
2125
Geoff Langae4852a2013-06-05 15:00:34 -04002126 texture->generateMipmaps();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002128 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002129 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132 }
2133}
2134
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002135void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002137 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002138
2139 try
2140 {
2141 if (n < 0)
2142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002144 }
2145
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002146 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002147
2148 if (context)
2149 {
2150 for (int i = 0; i < n; i++)
2151 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002152 fences[i] = context->createFenceNV();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002153 }
2154 }
2155 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002156 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002158 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002159 }
2160}
2161
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002164 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165
2166 try
2167 {
2168 if (n < 0)
2169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174
2175 if (context)
2176 {
2177 for (int i = 0; i < n; i++)
2178 {
2179 framebuffers[i] = context->createFramebuffer();
2180 }
2181 }
2182 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002183 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186 }
2187}
2188
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002189void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2190{
2191 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2192
2193 try
2194 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002195 gl::Context *context = gl::getNonLostContext();
2196
2197 if (context)
2198 {
Geoff Lang37dde692014-01-31 16:34:54 -05002199 if (n < 0)
2200 {
2201 return gl::error(GL_INVALID_VALUE);
2202 }
2203
2204 for (GLsizei i = 0; i < n; i++)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002205 {
2206 ids[i] = context->createQuery();
2207 }
2208 }
2209 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002210 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002212 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002213 }
2214}
2215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002218 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002219
2220 try
2221 {
2222 if (n < 0)
2223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225 }
2226
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002227 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228
2229 if (context)
2230 {
2231 for (int i = 0; i < n; i++)
2232 {
2233 renderbuffers[i] = context->createRenderbuffer();
2234 }
2235 }
2236 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002237 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240 }
2241}
2242
2243void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2244{
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002245 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246
2247 try
2248 {
2249 if (n < 0)
2250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002251 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252 }
2253
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255
2256 if (context)
2257 {
2258 for (int i = 0; i < n; i++)
2259 {
2260 textures[i] = context->createTexture();
2261 }
2262 }
2263 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002264 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002267 }
2268}
2269
daniel@transgaming.com85423182010-04-22 13:35:27 +00002270void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002272 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002273 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274 program, index, bufsize, length, size, type, name);
2275
2276 try
2277 {
2278 if (bufsize < 0)
2279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281 }
2282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002284
2285 if (context)
2286 {
2287 gl::Program *programObject = context->getProgram(program);
2288
2289 if (!programObject)
2290 {
2291 if (context->getShader(program))
2292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002293 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002294 }
2295 else
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002298 }
2299 }
2300
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002301 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002303 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002304 }
2305
2306 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2307 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002308 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002309 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002311 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 }
2313}
2314
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002315void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002316{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002317 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002318 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002319 program, index, bufsize, length, size, type, name);
2320
2321 try
2322 {
2323 if (bufsize < 0)
2324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 }
2327
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002329
2330 if (context)
2331 {
2332 gl::Program *programObject = context->getProgram(program);
2333
2334 if (!programObject)
2335 {
2336 if (context->getShader(program))
2337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002338 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002339 }
2340 else
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002343 }
2344 }
2345
2346 if (index >= (GLuint)programObject->getActiveUniformCount())
2347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002349 }
2350
2351 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002354 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358}
2359
2360void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002362 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002363 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 try
2366 {
2367 if (maxcount < 0)
2368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
2371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002373
2374 if (context)
2375 {
2376 gl::Program *programObject = context->getProgram(program);
2377
2378 if (!programObject)
2379 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002380 if (context->getShader(program))
2381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002382 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002383 }
2384 else
2385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002387 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002388 }
2389
2390 return programObject->getAttachedShaders(maxcount, count, shaders);
2391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002393 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397}
2398
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002399int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002401 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402
2403 try
2404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002405 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406
2407 if (context)
2408 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002409
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 gl::Program *programObject = context->getProgram(program);
2411
2412 if (!programObject)
2413 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002414 if (context->getShader(program))
2415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002416 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002417 }
2418 else
2419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002421 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002422 }
2423
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002424 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002425 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002427 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002428 }
2429
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002430 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 }
2432 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002433 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002435 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 }
2437
2438 return -1;
2439}
2440
2441void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002443 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444
2445 try
2446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002448
2449 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002450 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002451 GLenum nativeType;
2452 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002453 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2454 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002455 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002456 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002457
2458 if (nativeType == GL_BOOL)
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002459 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002460 context->getBooleanv(pname, params);
2461 }
Jamie Madill55856b12014-01-02 13:59:50 -05002462 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002463 {
Jamie Madill55856b12014-01-02 13:59:50 -05002464 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002465 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466 }
2467 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002468 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 }
2472}
2473
2474void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002476 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 +00002477
2478 try
2479 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002481
2482 if (context)
2483 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002484 if (!gl::ValidBufferTarget(context, target))
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002485 {
Jamie Madill8c96d582014-03-05 15:01:23 -05002486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002487 }
2488
Jamie Madill70656a62014-03-05 15:01:26 -05002489 if (!gl::ValidBufferParameter(context, pname))
2490 {
2491 return gl::error(GL_INVALID_ENUM);
2492 }
2493
Jamie Madill8c96d582014-03-05 15:01:23 -05002494 gl::Buffer *buffer = context->getTargetBuffer(target);
2495
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002496 if (!buffer)
2497 {
2498 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002500 }
2501
2502 switch (pname)
2503 {
2504 case GL_BUFFER_USAGE:
Jamie Madill70656a62014-03-05 15:01:26 -05002505 *params = static_cast<GLint>(buffer->usage());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002506 break;
2507 case GL_BUFFER_SIZE:
Jamie Madill70656a62014-03-05 15:01:26 -05002508 *params = gl::clampCast<GLint>(buffer->size());
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002509 break;
Jamie Madill70656a62014-03-05 15:01:26 -05002510 case GL_BUFFER_ACCESS_FLAGS:
2511 *params = buffer->accessFlags();
2512 break;
2513 case GL_BUFFER_MAPPED:
2514 *params = static_cast<GLint>(buffer->mapped());
2515 break;
2516 case GL_BUFFER_MAP_OFFSET:
2517 *params = gl::clampCast<GLint>(buffer->mapOffset());
2518 break;
2519 case GL_BUFFER_MAP_LENGTH:
2520 *params = gl::clampCast<GLint>(buffer->mapLength());
2521 break;
2522 default: UNREACHABLE(); break;
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002523 }
2524 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002525 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002526 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530}
2531
2532GLenum __stdcall glGetError(void)
2533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002534 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535
2536 gl::Context *context = gl::getContext();
2537
2538 if (context)
2539 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002540 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541 }
2542
2543 return GL_NO_ERROR;
2544}
2545
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002546void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002548 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002549
2550 try
2551 {
2552
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002553 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002554
2555 if (context)
2556 {
Jamie Madill33dc8432013-07-26 11:55:05 -04002557 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002558
2559 if (fenceObject == NULL)
2560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002561 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002562 }
2563
Jamie Madillfb9a7402013-07-26 11:55:01 -04002564 if (fenceObject->isFence() != GL_TRUE)
2565 {
2566 return gl::error(GL_INVALID_OPERATION);
2567 }
2568
2569 switch (pname)
2570 {
2571 case GL_FENCE_STATUS_NV:
2572 case GL_FENCE_CONDITION_NV:
2573 break;
2574
2575 default: return gl::error(GL_INVALID_ENUM);
2576 }
2577
2578 params[0] = fenceObject->getFencei(pname);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002579 }
2580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002581 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002584 }
2585}
2586
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002589 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590
2591 try
2592 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002593 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002594
2595 if (context)
2596 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002597 GLenum nativeType;
2598 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04002599 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2600 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002601 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002602 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002603
2604 if (nativeType == GL_FLOAT)
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002605 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002606 context->getFloatv(pname, params);
2607 }
Jamie Madill55856b12014-01-02 13:59:50 -05002608 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002609 {
Jamie Madill55856b12014-01-02 13:59:50 -05002610 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002611 }
2612 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002613 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002614 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002616 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002617 }
2618}
2619
2620void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2621{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002622 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 +00002623 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002624
2625 try
2626 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002628
2629 if (context)
2630 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002631 if (!gl::ValidFramebufferTarget(target))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002634 }
2635
Geoff Lang646559f2013-08-15 11:08:15 -04002636 switch (pname)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002637 {
Geoff Lang646559f2013-08-15 11:08:15 -04002638 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2639 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2640 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2641 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2642 break;
2643 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2644 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2645 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2646 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2647 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2651 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2652 if (context->getClientVersion() >= 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002653 {
Geoff Lang646559f2013-08-15 11:08:15 -04002654 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002655 }
Geoff Lang646559f2013-08-15 11:08:15 -04002656 default:
2657 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002658 }
Geoff Lang646559f2013-08-15 11:08:15 -04002659
2660 // Determine if the attachment is a valid enum
2661 switch (attachment)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002662 {
Geoff Lang646559f2013-08-15 11:08:15 -04002663 case GL_BACK:
2664 case GL_FRONT:
Jamie Madill3810bee2014-01-21 16:47:12 -05002665 case GL_DEPTH:
Geoff Lang646559f2013-08-15 11:08:15 -04002666 case GL_STENCIL:
2667 case GL_DEPTH_STENCIL_ATTACHMENT:
2668 if (context->getClientVersion() < 3)
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002669 {
Geoff Lang646559f2013-08-15 11:08:15 -04002670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002671 }
Geoff Lang646559f2013-08-15 11:08:15 -04002672 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002673
Geoff Lang646559f2013-08-15 11:08:15 -04002674 case GL_DEPTH_ATTACHMENT:
2675 case GL_STENCIL_ATTACHMENT:
2676 break;
2677
2678 default:
2679 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2680 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2681 {
2682 return gl::error(GL_INVALID_ENUM);
2683 }
2684 break;
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002685 }
2686
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05002687 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2688 ASSERT(framebufferHandle != GL_INVALID_INDEX);
Geoff Lang646559f2013-08-15 11:08:15 -04002689 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2690
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002691 GLenum attachmentType;
2692 GLuint attachmentHandle;
Geoff Lang309c92a2013-07-25 16:23:19 -04002693 GLuint attachmentLevel;
2694 GLuint attachmentLayer;
Geoff Lang646559f2013-08-15 11:08:15 -04002695 gl::Renderbuffer *renderbuffer;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002696
Geoff Lang646559f2013-08-15 11:08:15 -04002697 if(framebufferHandle == 0)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002698 {
Geoff Lang646559f2013-08-15 11:08:15 -04002699 if(context->getClientVersion() < 3)
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002700 {
Geoff Lang646559f2013-08-15 11:08:15 -04002701 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002702 }
2703
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002704 switch (attachment)
2705 {
Geoff Lang646559f2013-08-15 11:08:15 -04002706 case GL_BACK:
2707 attachmentType = framebuffer->getColorbufferType(0);
2708 attachmentHandle = framebuffer->getColorbufferHandle(0);
2709 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2710 attachmentLayer = framebuffer->getColorbufferLayer(0);
2711 renderbuffer = framebuffer->getColorbuffer(0);
2712 break;
2713 case GL_DEPTH:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002714 attachmentType = framebuffer->getDepthbufferType();
2715 attachmentHandle = framebuffer->getDepthbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002716 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2717 attachmentLayer = framebuffer->getDepthbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002718 renderbuffer = framebuffer->getDepthbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002719 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002720 case GL_STENCIL:
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002721 attachmentType = framebuffer->getStencilbufferType();
2722 attachmentHandle = framebuffer->getStencilbufferHandle();
Geoff Lang309c92a2013-07-25 16:23:19 -04002723 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2724 attachmentLayer = framebuffer->getStencilbufferLayer();
Geoff Lang646559f2013-08-15 11:08:15 -04002725 renderbuffer = framebuffer->getStencilbuffer();
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002726 break;
Geoff Lang646559f2013-08-15 11:08:15 -04002727 default:
2728 return gl::error(GL_INVALID_OPERATION);
2729 }
2730 }
2731 else
2732 {
2733 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2734 {
2735 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2736 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2737 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2738 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2739 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2740 renderbuffer = framebuffer->getColorbuffer(colorAttachment);
2741 }
2742 else
2743 {
2744 switch (attachment)
Geoff Lang55ba29c2013-07-11 16:57:53 -04002745 {
Geoff Lang646559f2013-08-15 11:08:15 -04002746 case GL_DEPTH_ATTACHMENT:
2747 attachmentType = framebuffer->getDepthbufferType();
2748 attachmentHandle = framebuffer->getDepthbufferHandle();
2749 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2750 attachmentLayer = framebuffer->getDepthbufferLayer();
2751 renderbuffer = framebuffer->getDepthbuffer();
2752 break;
2753 case GL_STENCIL_ATTACHMENT:
2754 attachmentType = framebuffer->getStencilbufferType();
2755 attachmentHandle = framebuffer->getStencilbufferHandle();
2756 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2757 attachmentLayer = framebuffer->getStencilbufferLayer();
2758 renderbuffer = framebuffer->getStencilbuffer();
2759 break;
2760 case GL_DEPTH_STENCIL_ATTACHMENT:
2761 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2762 {
2763 return gl::error(GL_INVALID_OPERATION);
2764 }
2765 attachmentType = framebuffer->getDepthStencilbufferType();
2766 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2767 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2768 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2769 renderbuffer = framebuffer->getDepthStencilBuffer();
2770 break;
2771 default:
Geoff Lang55ba29c2013-07-11 16:57:53 -04002772 return gl::error(GL_INVALID_OPERATION);
2773 }
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002774 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002775 }
2776
2777 GLenum attachmentObjectType; // Type category
Geoff Lang646559f2013-08-15 11:08:15 -04002778 if (framebufferHandle == 0)
2779 {
2780 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2781 }
2782 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002783 {
2784 attachmentObjectType = attachmentType;
2785 }
Geoff Lang0fe19492013-07-25 17:04:31 -04002786 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002787 {
2788 attachmentObjectType = GL_TEXTURE;
2789 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00002790 else
2791 {
2792 UNREACHABLE();
2793 return;
2794 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002795
Geoff Lang646559f2013-08-15 11:08:15 -04002796 if (attachmentObjectType == GL_NONE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002797 {
Geoff Lang646559f2013-08-15 11:08:15 -04002798 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2799 // is NONE, then querying any other pname will generate INVALID_ENUM.
2800
2801 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2802 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2803 // INVALID_OPERATION for all other pnames
2804
2805 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002806 {
Geoff Lang646559f2013-08-15 11:08:15 -04002807 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2808 *params = attachmentObjectType;
2809 break;
2810
2811 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2812 if (context->getClientVersion() < 3)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002813 {
Geoff Lang646559f2013-08-15 11:08:15 -04002814 return gl::error(GL_INVALID_ENUM);
2815 }
2816 *params = 0;
2817 break;
2818
2819 default:
2820 if (context->getClientVersion() < 3)
2821 {
2822 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002823 }
2824 else
2825 {
Geoff Lang646559f2013-08-15 11:08:15 -04002826 gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002827 }
2828 }
Geoff Lang646559f2013-08-15 11:08:15 -04002829 }
2830 else
2831 {
2832 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2833 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2834 ASSERT(renderbuffer != NULL);
2835
2836 switch (pname)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002837 {
Geoff Lang646559f2013-08-15 11:08:15 -04002838 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2839 *params = attachmentObjectType;
2840 break;
2841
2842 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2843 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2844 {
2845 return gl::error(GL_INVALID_ENUM);
2846 }
2847 *params = attachmentHandle;
2848 break;
2849
2850 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2851 if (attachmentObjectType != GL_TEXTURE)
2852 {
2853 return gl::error(GL_INVALID_ENUM);
2854 }
2855 *params = attachmentLevel;
2856 break;
2857
2858 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2859 if (attachmentObjectType != GL_TEXTURE)
2860 {
2861 return gl::error(GL_INVALID_ENUM);
2862 }
2863 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2864 break;
2865
2866 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2867 *params = renderbuffer->getRedSize();
2868 break;
2869
2870 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2871 *params = renderbuffer->getGreenSize();
2872 break;
2873
2874 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2875 *params = renderbuffer->getBlueSize();
2876 break;
2877
2878 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2879 *params = renderbuffer->getAlphaSize();
2880 break;
2881
2882 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2883 *params = renderbuffer->getDepthSize();
2884 break;
2885
2886 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2887 *params = renderbuffer->getStencilSize();
2888 break;
2889
2890 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2891 if (attachment == GL_DEPTH_STENCIL)
2892 {
2893 gl::error(GL_INVALID_OPERATION);
2894 }
2895 *params = renderbuffer->getComponentType();
2896 break;
2897
2898 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2899 *params = renderbuffer->getColorEncoding();
2900 break;
2901
2902 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2903 if (attachmentObjectType != GL_TEXTURE)
2904 {
2905 return gl::error(GL_INVALID_ENUM);
2906 }
2907 *params = attachmentLayer;
2908 break;
2909
2910 default:
2911 UNREACHABLE();
2912 break;
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002913 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002914 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915 }
2916 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002917 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002920 }
2921}
2922
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002923GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2924{
2925 EVENT("()");
2926
2927 try
2928 {
2929 gl::Context *context = gl::getContext();
2930
2931 if (context)
2932 {
2933 return context->getResetStatus();
2934 }
2935
2936 return GL_NO_ERROR;
2937 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002938 catch (...)
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00002939 {
2940 return GL_OUT_OF_MEMORY;
2941 }
2942}
2943
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002946 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947
2948 try
2949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002950 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002951
2952 if (context)
2953 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002954 GLenum nativeType;
2955 unsigned int numParams = 0;
Jamie Madill79f2f452013-12-19 11:13:02 -05002956
Jamie Madill893ab082014-05-16 16:56:10 -04002957 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2958 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002959 return;
Jamie Madill893ab082014-05-16 16:56:10 -04002960 }
Jamie Madill79f2f452013-12-19 11:13:02 -05002961
2962 if (nativeType == GL_INT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963 {
Jamie Madill79f2f452013-12-19 11:13:02 -05002964 context->getIntegerv(pname, params);
2965 }
Jamie Madill55856b12014-01-02 13:59:50 -05002966 else
Jamie Madill79f2f452013-12-19 11:13:02 -05002967 {
Jamie Madill55856b12014-01-02 13:59:50 -05002968 CastStateValues(context, nativeType, pname, numParams, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969 }
2970 }
2971 }
Jamie Madillde0ec752014-05-05 15:10:38 -04002972 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002974 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002975 }
2976}
2977
2978void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002980 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981
2982 try
2983 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002984 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985
2986 if (context)
2987 {
2988 gl::Program *programObject = context->getProgram(program);
2989
2990 if (!programObject)
2991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002993 }
2994
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00002995 if (context->getClientVersion() < 3)
2996 {
2997 switch (pname)
2998 {
2999 case GL_ACTIVE_UNIFORM_BLOCKS:
3000 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003001 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3002 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3003 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003004 return gl::error(GL_INVALID_ENUM);
3005 }
3006 }
3007
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 switch (pname)
3009 {
3010 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003011 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 return;
3013 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003014 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003015 return;
3016 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003017 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 return;
3019 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003020 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003021 return;
3022 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003023 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003024 return;
3025 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003026 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027 return;
3028 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003029 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030 return;
3031 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003032 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003033 return;
3034 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003035 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003036 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003037 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003038 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003039 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003040 case GL_ACTIVE_UNIFORM_BLOCKS:
3041 *params = programObject->getActiveUniformBlockCount();
3042 return;
3043 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3044 *params = programObject->getActiveUniformBlockMaxLength();
3045 break;
Geoff Lang1b6edcb2014-02-03 14:27:56 -05003046 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3047 *params = programObject->getTransformFeedbackBufferMode();
3048 break;
3049 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3050 *params = programObject->getTransformFeedbackVaryingCount();
3051 break;
3052 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3053 *params = programObject->getTransformFeedbackVaryingMaxLength();
3054 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003056 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 }
3058 }
3059 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003060 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003062 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 }
3064}
3065
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003066void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003068 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 +00003069 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003070
3071 try
3072 {
3073 if (bufsize < 0)
3074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003075 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 }
3077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003079
3080 if (context)
3081 {
3082 gl::Program *programObject = context->getProgram(program);
3083
3084 if (!programObject)
3085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003086 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003087 }
3088
3089 programObject->getInfoLog(bufsize, length, infolog);
3090 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003091 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003092 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003094 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003095 }
3096}
3097
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003098void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3099{
3100 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3101
3102 try
3103 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003104 gl::Context *context = gl::getNonLostContext();
3105
3106 if (context)
3107 {
Geoff Lang37dde692014-01-31 16:34:54 -05003108 if (!ValidQueryType(context, target))
3109 {
3110 return gl::error(GL_INVALID_ENUM);
3111 }
3112
3113 switch (pname)
3114 {
3115 case GL_CURRENT_QUERY_EXT:
Jamie Madill45c785d2014-05-13 14:09:34 -04003116 params[0] = context->getActiveQueryId(target);
Geoff Lang37dde692014-01-31 16:34:54 -05003117 break;
3118
3119 default:
3120 return gl::error(GL_INVALID_ENUM);
3121 }
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003122 }
3123 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003124 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003126 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003127 }
3128}
3129
3130void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3131{
3132 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3133
3134 try
3135 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003136 gl::Context *context = gl::getNonLostContext();
3137
3138 if (context)
3139 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003140 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3141
3142 if (!queryObject)
3143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003144 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003145 }
3146
Jamie Madill45c785d2014-05-13 14:09:34 -04003147 if (context->getActiveQueryId(queryObject->getType()) == id)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003150 }
3151
3152 switch(pname)
3153 {
3154 case GL_QUERY_RESULT_EXT:
3155 params[0] = queryObject->getResult();
3156 break;
3157 case GL_QUERY_RESULT_AVAILABLE_EXT:
3158 params[0] = queryObject->isResultAvailable();
3159 break;
3160 default:
Geoff Lang37dde692014-01-31 16:34:54 -05003161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003162 }
3163 }
3164 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003165 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003167 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003168 }
3169}
3170
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003171void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003173 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 +00003174
3175 try
3176 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003178
3179 if (context)
3180 {
3181 if (target != GL_RENDERBUFFER)
3182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003183 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003184 }
3185
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003186 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003188 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003189 }
3190
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003191 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003192
3193 switch (pname)
3194 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003195 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3196 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3197 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3198 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3199 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3200 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3201 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3202 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3203 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003204 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003205 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003206 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003207 *params = renderbuffer->getSamples();
3208 }
3209 else
3210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003211 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003212 }
3213 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003214 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003216 }
3217 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003218 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003219 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 }
3223}
3224
3225void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3226{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003227 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228
3229 try
3230 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003231 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232
3233 if (context)
3234 {
3235 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003236
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237 if (!shaderObject)
3238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003239 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003240 }
3241
3242 switch (pname)
3243 {
3244 case GL_SHADER_TYPE:
3245 *params = shaderObject->getType();
3246 return;
3247 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003248 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003249 return;
3250 case GL_COMPILE_STATUS:
3251 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3252 return;
3253 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003254 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255 return;
3256 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003257 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003258 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003259 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3260 *params = shaderObject->getTranslatedSourceLength();
3261 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003264 }
3265 }
3266 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003267 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 }
3271}
3272
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003273void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003275 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003276 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277
3278 try
3279 {
3280 if (bufsize < 0)
3281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 }
3284
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003286
3287 if (context)
3288 {
3289 gl::Shader *shaderObject = context->getShader(shader);
3290
3291 if (!shaderObject)
3292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003294 }
3295
3296 shaderObject->getInfoLog(bufsize, length, infolog);
3297 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003298 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003299 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003301 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302 }
3303}
3304
3305void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003307 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 +00003308 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309
3310 try
3311 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003312 switch (shadertype)
3313 {
3314 case GL_VERTEX_SHADER:
3315 case GL_FRAGMENT_SHADER:
3316 break;
3317 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003319 }
3320
3321 switch (precisiontype)
3322 {
3323 case GL_LOW_FLOAT:
3324 case GL_MEDIUM_FLOAT:
3325 case GL_HIGH_FLOAT:
3326 // Assume IEEE 754 precision
3327 range[0] = 127;
3328 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003329 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003330 break;
3331 case GL_LOW_INT:
3332 case GL_MEDIUM_INT:
3333 case GL_HIGH_INT:
3334 // Some (most) hardware only supports single-precision floating-point numbers,
3335 // which can accurately represent integers up to +/-16777216
3336 range[0] = 24;
3337 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003338 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003339 break;
3340 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003341 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003342 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003344 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003347 }
3348}
3349
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003350void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003352 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 +00003353 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354
3355 try
3356 {
3357 if (bufsize < 0)
3358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
3361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003363
3364 if (context)
3365 {
3366 gl::Shader *shaderObject = context->getShader(shader);
3367
3368 if (!shaderObject)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003371 }
3372
3373 shaderObject->getSource(bufsize, length, source);
3374 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003375 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003376 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003378 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 }
3380}
3381
zmo@google.coma574f782011-10-03 21:45:23 +00003382void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3383{
3384 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3385 shader, bufsize, length, source);
3386
3387 try
3388 {
3389 if (bufsize < 0)
3390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003391 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003392 }
3393
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003394 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003395
3396 if (context)
3397 {
3398 gl::Shader *shaderObject = context->getShader(shader);
3399
3400 if (!shaderObject)
3401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003402 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003403 }
3404
3405 shaderObject->getTranslatedSource(bufsize, length, source);
3406 }
3407 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003408 catch (...)
zmo@google.coma574f782011-10-03 21:45:23 +00003409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003410 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003411 }
3412}
3413
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003414const GLubyte* __stdcall glGetString(GLenum name)
3415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003416 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003417
3418 try
3419 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003421
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003422 switch (name)
3423 {
3424 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003425 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003427 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003429 if (context->getClientVersion() == 2)
3430 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003431 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003432 }
3433 else
3434 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003435 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003436 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003437 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003438 if (context->getClientVersion() == 2)
3439 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003440 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003441 }
3442 else
3443 {
Jamie Madill0aa84f62014-02-13 13:17:23 -05003444 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00003445 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003446 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00003447 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003449 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 }
3451 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003452 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003454 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456}
3457
3458void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3459{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003460 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 +00003461
3462 try
3463 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003464 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003465
3466 if (context)
3467 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003468 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003469
Jamie Madillfb8a8302013-07-03 14:24:12 -04003470 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003473 }
3474
3475 switch (pname)
3476 {
3477 case GL_TEXTURE_MAG_FILTER:
3478 *params = (GLfloat)texture->getMagFilter();
3479 break;
3480 case GL_TEXTURE_MIN_FILTER:
3481 *params = (GLfloat)texture->getMinFilter();
3482 break;
3483 case GL_TEXTURE_WRAP_S:
3484 *params = (GLfloat)texture->getWrapS();
3485 break;
3486 case GL_TEXTURE_WRAP_T:
3487 *params = (GLfloat)texture->getWrapT();
3488 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003489 case GL_TEXTURE_WRAP_R:
3490 if (context->getClientVersion() < 3)
3491 {
3492 return gl::error(GL_INVALID_ENUM);
3493 }
3494 *params = (GLfloat)texture->getWrapR();
3495 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003496 case GL_TEXTURE_IMMUTABLE_FORMAT:
3497 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003498 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3499 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003500 case GL_TEXTURE_IMMUTABLE_LEVELS:
3501 if (context->getClientVersion() < 3)
3502 {
3503 return gl::error(GL_INVALID_ENUM);
3504 }
Jamie Madill51a94372013-10-24 17:49:43 -04003505 *params = (GLfloat)texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003506 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003507 case GL_TEXTURE_USAGE_ANGLE:
3508 *params = (GLfloat)texture->getUsage();
3509 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003510 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3511 if (!context->supportsTextureFilterAnisotropy())
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003514 }
3515 *params = (GLfloat)texture->getMaxAnisotropy();
3516 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003517 case GL_TEXTURE_SWIZZLE_R:
3518 if (context->getClientVersion() < 3)
3519 {
3520 return gl::error(GL_INVALID_ENUM);
3521 }
3522 *params = (GLfloat)texture->getSwizzleRed();
3523 break;
3524 case GL_TEXTURE_SWIZZLE_G:
3525 if (context->getClientVersion() < 3)
3526 {
3527 return gl::error(GL_INVALID_ENUM);
3528 }
3529 *params = (GLfloat)texture->getSwizzleGreen();
3530 break;
3531 case GL_TEXTURE_SWIZZLE_B:
3532 if (context->getClientVersion() < 3)
3533 {
3534 return gl::error(GL_INVALID_ENUM);
3535 }
3536 *params = (GLfloat)texture->getSwizzleBlue();
3537 break;
3538 case GL_TEXTURE_SWIZZLE_A:
3539 if (context->getClientVersion() < 3)
3540 {
3541 return gl::error(GL_INVALID_ENUM);
3542 }
3543 *params = (GLfloat)texture->getSwizzleAlpha();
3544 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003545 case GL_TEXTURE_BASE_LEVEL:
3546 if (context->getClientVersion() < 3)
3547 {
3548 return gl::error(GL_INVALID_ENUM);
3549 }
3550 *params = (GLfloat)texture->getBaseLevel();
3551 break;
3552 case GL_TEXTURE_MAX_LEVEL:
3553 if (context->getClientVersion() < 3)
3554 {
3555 return gl::error(GL_INVALID_ENUM);
3556 }
3557 *params = (GLfloat)texture->getMaxLevel();
3558 break;
3559 case GL_TEXTURE_MIN_LOD:
3560 if (context->getClientVersion() < 3)
3561 {
3562 return gl::error(GL_INVALID_ENUM);
3563 }
3564 *params = texture->getMinLod();
3565 break;
3566 case GL_TEXTURE_MAX_LOD:
3567 if (context->getClientVersion() < 3)
3568 {
3569 return gl::error(GL_INVALID_ENUM);
3570 }
3571 *params = texture->getMaxLod();
3572 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003573 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003575 }
3576 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003578 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003581 }
3582}
3583
3584void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003586 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 +00003587
3588 try
3589 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003591
3592 if (context)
3593 {
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05003594 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003595
Jamie Madillfb8a8302013-07-03 14:24:12 -04003596 if (!texture)
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003598 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003599 }
3600
3601 switch (pname)
3602 {
3603 case GL_TEXTURE_MAG_FILTER:
3604 *params = texture->getMagFilter();
3605 break;
3606 case GL_TEXTURE_MIN_FILTER:
3607 *params = texture->getMinFilter();
3608 break;
3609 case GL_TEXTURE_WRAP_S:
3610 *params = texture->getWrapS();
3611 break;
3612 case GL_TEXTURE_WRAP_T:
3613 *params = texture->getWrapT();
3614 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00003615 case GL_TEXTURE_WRAP_R:
3616 if (context->getClientVersion() < 3)
3617 {
3618 return gl::error(GL_INVALID_ENUM);
3619 }
3620 *params = texture->getWrapR();
3621 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003622 case GL_TEXTURE_IMMUTABLE_FORMAT:
3623 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003624 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3625 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003626 case GL_TEXTURE_IMMUTABLE_LEVELS:
3627 if (context->getClientVersion() < 3)
3628 {
3629 return gl::error(GL_INVALID_ENUM);
3630 }
Jamie Madill51a94372013-10-24 17:49:43 -04003631 *params = texture->immutableLevelCount();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00003632 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003633 case GL_TEXTURE_USAGE_ANGLE:
3634 *params = texture->getUsage();
3635 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003636 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3637 if (!context->supportsTextureFilterAnisotropy())
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003640 }
3641 *params = (GLint)texture->getMaxAnisotropy();
3642 break;
Geoff Langbc90a482013-09-17 16:51:27 -04003643 case GL_TEXTURE_SWIZZLE_R:
3644 if (context->getClientVersion() < 3)
3645 {
3646 return gl::error(GL_INVALID_ENUM);
3647 }
3648 *params = texture->getSwizzleRed();
3649 break;
3650 case GL_TEXTURE_SWIZZLE_G:
3651 if (context->getClientVersion() < 3)
3652 {
3653 return gl::error(GL_INVALID_ENUM);
3654 }
3655 *params = texture->getSwizzleGreen();
3656 break;
3657 case GL_TEXTURE_SWIZZLE_B:
3658 if (context->getClientVersion() < 3)
3659 {
3660 return gl::error(GL_INVALID_ENUM);
3661 }
3662 *params = texture->getSwizzleBlue();
3663 break;
3664 case GL_TEXTURE_SWIZZLE_A:
3665 if (context->getClientVersion() < 3)
3666 {
3667 return gl::error(GL_INVALID_ENUM);
3668 }
3669 *params = texture->getSwizzleAlpha();
3670 break;
Nicolas Capens8de68282014-04-04 11:10:27 -04003671 case GL_TEXTURE_BASE_LEVEL:
3672 if (context->getClientVersion() < 3)
3673 {
3674 return gl::error(GL_INVALID_ENUM);
3675 }
3676 *params = texture->getBaseLevel();
3677 break;
3678 case GL_TEXTURE_MAX_LEVEL:
3679 if (context->getClientVersion() < 3)
3680 {
3681 return gl::error(GL_INVALID_ENUM);
3682 }
3683 *params = texture->getMaxLevel();
3684 break;
3685 case GL_TEXTURE_MIN_LOD:
3686 if (context->getClientVersion() < 3)
3687 {
3688 return gl::error(GL_INVALID_ENUM);
3689 }
3690 *params = (GLint)texture->getMinLod();
3691 break;
3692 case GL_TEXTURE_MAX_LOD:
3693 if (context->getClientVersion() < 3)
3694 {
3695 return gl::error(GL_INVALID_ENUM);
3696 }
3697 *params = (GLint)texture->getMaxLod();
3698 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003699 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003700 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003701 }
3702 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003703 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003704 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 }
3708}
3709
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003710void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3711{
3712 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3713 program, location, bufSize, params);
3714
3715 try
3716 {
3717 if (bufSize < 0)
3718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003720 }
3721
3722 gl::Context *context = gl::getNonLostContext();
3723
3724 if (context)
3725 {
3726 if (program == 0)
3727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003729 }
3730
3731 gl::Program *programObject = context->getProgram(program);
3732
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003733 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003736 }
3737
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003738 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3739 if (!programBinary)
3740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003742 }
3743
3744 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003746 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003747 }
3748 }
3749 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003750 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003753 }
3754}
3755
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003756void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003758 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003759
3760 try
3761 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003762 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003763
3764 if (context)
3765 {
3766 if (program == 0)
3767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003769 }
3770
3771 gl::Program *programObject = context->getProgram(program);
3772
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003773 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003775 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003776 }
3777
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003778 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3779 if (!programBinary)
3780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003782 }
3783
3784 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003786 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003787 }
3788 }
3789 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003790 catch (...)
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003793 }
3794}
3795
3796void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3797{
3798 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3799 program, location, bufSize, params);
3800
3801 try
3802 {
3803 if (bufSize < 0)
3804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003806 }
3807
3808 gl::Context *context = gl::getNonLostContext();
3809
3810 if (context)
3811 {
3812 if (program == 0)
3813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003815 }
3816
3817 gl::Program *programObject = context->getProgram(program);
3818
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003819 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003821 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003822 }
3823
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003824 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3825 if (!programBinary)
3826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003827 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003828 }
3829
3830 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003832 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003833 }
3834 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003836 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003839 }
3840}
3841
3842void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003844 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003845
3846 try
3847 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003848 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003849
3850 if (context)
3851 {
3852 if (program == 0)
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003855 }
3856
3857 gl::Program *programObject = context->getProgram(program);
3858
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003859 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003862 }
3863
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003864 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3865 if (!programBinary)
3866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003867 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003868 }
3869
3870 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003873 }
3874 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003875 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003876 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003879 }
3880}
3881
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003882int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003884 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885
3886 try
3887 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889
3890 if (strstr(name, "gl_") == name)
3891 {
3892 return -1;
3893 }
3894
3895 if (context)
3896 {
3897 gl::Program *programObject = context->getProgram(program);
3898
3899 if (!programObject)
3900 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003901 if (context->getShader(program))
3902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003904 }
3905 else
3906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003907 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003908 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003909 }
3910
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003911 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003912 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003914 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003915 }
3916
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003917 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918 }
3919 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003920 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003922 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923 }
3924
3925 return -1;
3926}
3927
3928void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3929{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003930 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931
3932 try
3933 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003935
daniel@transgaming.come0078962010-04-15 20:45:08 +00003936 if (context)
3937 {
3938 if (index >= gl::MAX_VERTEX_ATTRIBS)
3939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003941 }
3942
daniel@transgaming.com83921382011-01-08 05:46:00 +00003943 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003944
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003945 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003946 {
Jamie Madillaff71502013-07-02 11:57:05 -04003947 return;
3948 }
3949
3950 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3951 {
3952 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3953 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003954 {
Jamie Madillaff71502013-07-02 11:57:05 -04003955 params[i] = currentValueData.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003956 }
Jamie Madillaff71502013-07-02 11:57:05 -04003957 }
3958 else
3959 {
3960 *params = attribState.querySingleParameter<GLfloat>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003961 }
3962 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003963 }
Jamie Madillde0ec752014-05-05 15:10:38 -04003964 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 }
3968}
3969
3970void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003972 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973
3974 try
3975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977
daniel@transgaming.come0078962010-04-15 20:45:08 +00003978 if (context)
3979 {
3980 if (index >= gl::MAX_VERTEX_ATTRIBS)
3981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003983 }
3984
daniel@transgaming.com83921382011-01-08 05:46:00 +00003985 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003986
Geoff Lang34dbb6f2013-08-05 15:05:47 -04003987 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
daniel@transgaming.come0078962010-04-15 20:45:08 +00003988 {
Jamie Madillaff71502013-07-02 11:57:05 -04003989 return;
3990 }
3991
3992 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3993 {
3994 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
3995 for (int i = 0; i < 4; ++i)
daniel@transgaming.come0078962010-04-15 20:45:08 +00003996 {
Jamie Madillaff71502013-07-02 11:57:05 -04003997 float currentValue = currentValueData.FloatValues[i];
Jamie Madillaf496912013-07-19 16:36:54 -04003998 params[i] = gl::iround<GLint>(currentValue);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003999 }
Jamie Madillaff71502013-07-02 11:57:05 -04004000 }
4001 else
4002 {
4003 *params = attribState.querySingleParameter<GLint>(pname);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004004 }
4005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004006 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004007 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010 }
4011}
4012
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004013void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004015 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016
4017 try
4018 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004019 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020
daniel@transgaming.come0078962010-04-15 20:45:08 +00004021 if (context)
4022 {
4023 if (index >= gl::MAX_VERTEX_ATTRIBS)
4024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004026 }
4027
4028 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004030 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004031 }
4032
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004033 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004036 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039 }
4040}
4041
4042void __stdcall glHint(GLenum target, GLenum mode)
4043{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004044 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045
4046 try
4047 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004048 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004049 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004050 case GL_FASTEST:
4051 case GL_NICEST:
4052 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004053 break;
4054 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004056 }
4057
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004059 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004060 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004061 case GL_GENERATE_MIPMAP_HINT:
4062 if (context) context->setGenerateMipmapHint(mode);
4063 break;
4064 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4065 if (context) context->setFragmentShaderDerivativeHint(mode);
4066 break;
4067 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004068 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004069 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004070 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004071 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074 }
4075}
4076
4077GLboolean __stdcall glIsBuffer(GLuint buffer)
4078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004079 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080
4081 try
4082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084
4085 if (context && buffer)
4086 {
4087 gl::Buffer *bufferObject = context->getBuffer(buffer);
4088
4089 if (bufferObject)
4090 {
4091 return GL_TRUE;
4092 }
4093 }
4094 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004095 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004097 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004098 }
4099
4100 return GL_FALSE;
4101}
4102
4103GLboolean __stdcall glIsEnabled(GLenum cap)
4104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004105 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106
4107 try
4108 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004109 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004110
4111 if (context)
4112 {
Geoff Lang0550d032014-01-30 11:29:07 -05004113 if (!ValidCap(context, cap))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004115 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116 }
Geoff Lang0550d032014-01-30 11:29:07 -05004117
4118 return context->getCap(cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 }
4120 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004121 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 }
4125
4126 return false;
4127}
4128
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004129GLboolean __stdcall glIsFenceNV(GLuint fence)
4130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004131 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004132
4133 try
4134 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004135 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004136
4137 if (context)
4138 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004139 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004140
4141 if (fenceObject == NULL)
4142 {
4143 return GL_FALSE;
4144 }
4145
4146 return fenceObject->isFence();
4147 }
4148 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004149 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004151 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004152 }
4153
4154 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004155}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004156
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004157GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004159 EVENT("(GLuint framebuffer = %d)", framebuffer);
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 && framebuffer)
4166 {
4167 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4168
4169 if (framebufferObject)
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 glIsProgram(GLuint program)
4184{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004185 EVENT("(GLuint program = %d)", program);
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 && program)
4192 {
4193 gl::Program *programObject = context->getProgram(program);
4194
4195 if (programObject)
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
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004209GLboolean __stdcall glIsQueryEXT(GLuint id)
4210{
4211 EVENT("(GLuint id = %d)", id);
4212
4213 try
4214 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004215 gl::Context *context = gl::getNonLostContext();
4216
4217 if (context)
4218 {
Geoff Lang37dde692014-01-31 16:34:54 -05004219 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004220 }
4221 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004222 catch (...)
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004224 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004225 }
4226
4227 return GL_FALSE;
4228}
4229
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004232 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004233
4234 try
4235 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004236 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004237
4238 if (context && renderbuffer)
4239 {
4240 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4241
4242 if (renderbufferObject)
4243 {
4244 return GL_TRUE;
4245 }
4246 }
4247 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004248 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004251 }
4252
4253 return GL_FALSE;
4254}
4255
4256GLboolean __stdcall glIsShader(GLuint shader)
4257{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004258 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004259
4260 try
4261 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004262 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263
4264 if (context && shader)
4265 {
4266 gl::Shader *shaderObject = context->getShader(shader);
4267
4268 if (shaderObject)
4269 {
4270 return GL_TRUE;
4271 }
4272 }
4273 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004274 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004276 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277 }
4278
4279 return GL_FALSE;
4280}
4281
4282GLboolean __stdcall glIsTexture(GLuint texture)
4283{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004284 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004285
4286 try
4287 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004289
4290 if (context && texture)
4291 {
4292 gl::Texture *textureObject = context->getTexture(texture);
4293
4294 if (textureObject)
4295 {
4296 return GL_TRUE;
4297 }
4298 }
4299 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004300 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004302 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004303 }
4304
4305 return GL_FALSE;
4306}
4307
4308void __stdcall glLineWidth(GLfloat width)
4309{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004310 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004311
4312 try
4313 {
4314 if (width <= 0.0f)
4315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004316 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004317 }
4318
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004319 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004320
4321 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004322 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004323 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324 }
4325 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004326 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004329 }
4330}
4331
4332void __stdcall glLinkProgram(GLuint program)
4333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004334 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004335
4336 try
4337 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004338 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339
4340 if (context)
4341 {
4342 gl::Program *programObject = context->getProgram(program);
4343
4344 if (!programObject)
4345 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004346 if (context->getShader(program))
4347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004348 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004349 }
4350 else
4351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004352 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004353 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354 }
4355
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004356 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357 }
4358 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004359 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362 }
4363}
4364
4365void __stdcall glPixelStorei(GLenum pname, GLint param)
4366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004367 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004368
4369 try
4370 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004372
4373 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004375 switch (pname)
4376 {
4377 case GL_UNPACK_ALIGNMENT:
4378 if (param != 1 && param != 2 && param != 4 && param != 8)
4379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004380 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004381 }
4382
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004383 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004384 break;
4385
4386 case GL_PACK_ALIGNMENT:
4387 if (param != 1 && param != 2 && param != 4 && param != 8)
4388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004389 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004390 }
4391
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004392 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004393 break;
4394
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004395 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4396 context->setPackReverseRowOrder(param != 0);
4397 break;
4398
shannonwoods@chromium.orgabf14cc2013-05-30 00:20:58 +00004399 case GL_UNPACK_IMAGE_HEIGHT:
4400 case GL_UNPACK_SKIP_IMAGES:
4401 case GL_UNPACK_ROW_LENGTH:
4402 case GL_UNPACK_SKIP_ROWS:
4403 case GL_UNPACK_SKIP_PIXELS:
4404 case GL_PACK_ROW_LENGTH:
4405 case GL_PACK_SKIP_ROWS:
4406 case GL_PACK_SKIP_PIXELS:
4407 if (context->getClientVersion() < 3)
4408 {
4409 return gl::error(GL_INVALID_ENUM);
4410 }
4411 UNIMPLEMENTED();
4412 break;
4413
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004414 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004415 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004416 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417 }
4418 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004419 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004421 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
4423}
4424
4425void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4426{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004427 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428
4429 try
4430 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004431 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004432
4433 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004434 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004435 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 }
4437 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004438 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004440 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441 }
4442}
4443
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004444void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4445 GLenum format, GLenum type, GLsizei bufSize,
4446 GLvoid *data)
4447{
4448 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4449 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4450 x, y, width, height, format, type, bufSize, data);
4451
4452 try
4453 {
4454 if (width < 0 || height < 0 || bufSize < 0)
4455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004456 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004457 }
4458
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004459 gl::Context *context = gl::getNonLostContext();
4460
4461 if (context)
4462 {
Jamie Madill26e91952014-03-05 15:01:27 -05004463 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4464 format, type, &bufSize, data))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004465 {
Jamie Madill26e91952014-03-05 15:01:27 -05004466 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004467 }
4468
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004469 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4470 }
4471 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004472 catch (...)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004475 }
4476}
4477
4478void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4479 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004481 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004482 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004483 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004484
4485 try
4486 {
4487 if (width < 0 || height < 0)
4488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004489 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490 }
4491
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004493
4494 if (context)
4495 {
Jamie Madill26e91952014-03-05 15:01:27 -05004496 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4497 format, type, NULL, pixels))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004498 {
Jamie Madill26e91952014-03-05 15:01:27 -05004499 return;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004500 }
4501
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004502 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004503 }
4504 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004505 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004507 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508 }
4509}
4510
4511void __stdcall glReleaseShaderCompiler(void)
4512{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004513 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004514
4515 try
4516 {
4517 gl::Shader::releaseCompiler();
4518 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004519 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 }
4523}
4524
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004525void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004527 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 +00004528 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004529
4530 try
4531 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004532 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533
4534 if (context)
4535 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004536 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004537 width, height, true))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00004538 {
Geoff Lang2e1dcd52013-05-29 10:34:08 -04004539 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004540 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00004541
4542 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004543 }
4544 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004545 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004548 }
4549}
4550
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004551void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4552{
4553 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4554}
4555
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4557{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00004558 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004559
4560 try
4561 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004562 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564 if (context)
4565 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004566 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004567 }
4568 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004569 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004572 }
4573}
4574
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004575void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004577 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004578
4579 try
4580 {
4581 if (condition != GL_ALL_COMPLETED_NV)
4582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004583 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004584 }
4585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004586 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004587
4588 if (context)
4589 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004590 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004591
4592 if (fenceObject == NULL)
4593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004594 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004595 }
4596
4597 fenceObject->setFence(condition);
4598 }
4599 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004600 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004602 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004603 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004604}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004605
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004608 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 +00004609
4610 try
4611 {
4612 if (width < 0 || height < 0)
4613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004614 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004615 }
4616
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004617 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004618
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 if (context)
4620 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004621 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004624 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
4628}
4629
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004630void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004632 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004633 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004634 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635
4636 try
4637 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004638 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004639 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004640 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004641 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644 }
4645}
4646
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00004647void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004649 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 +00004650 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004651
4652 try
4653 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004654 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004656 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657 }
4658
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004659 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004660
4661 if (context)
4662 {
4663 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004664
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004665 if (!shaderObject)
4666 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004667 if (context->getProgram(shader))
4668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004669 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004670 }
4671 else
4672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004673 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004674 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675 }
4676
4677 shaderObject->setSource(count, string, length);
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 glStencilFunc(GLenum func, GLint ref, GLuint mask)
4687{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004688 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689}
4690
4691void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004693 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 +00004694
4695 try
4696 {
4697 switch (face)
4698 {
4699 case GL_FRONT:
4700 case GL_BACK:
4701 case GL_FRONT_AND_BACK:
4702 break;
4703 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705 }
4706
4707 switch (func)
4708 {
4709 case GL_NEVER:
4710 case GL_ALWAYS:
4711 case GL_LESS:
4712 case GL_LEQUAL:
4713 case GL_EQUAL:
4714 case GL_GEQUAL:
4715 case GL_GREATER:
4716 case GL_NOTEQUAL:
4717 break;
4718 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004719 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 }
4721
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004722 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004723
4724 if (context)
4725 {
4726 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4727 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004728 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729 }
4730
4731 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4732 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004733 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004734 }
4735 }
4736 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004737 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004740 }
4741}
4742
4743void __stdcall glStencilMask(GLuint mask)
4744{
4745 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4746}
4747
4748void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4749{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004750 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751
4752 try
4753 {
4754 switch (face)
4755 {
4756 case GL_FRONT:
4757 case GL_BACK:
4758 case GL_FRONT_AND_BACK:
4759 break;
4760 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004761 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762 }
4763
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004764 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765
4766 if (context)
4767 {
4768 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4769 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004770 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004771 }
4772
4773 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4774 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004775 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777 }
4778 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004779 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004781 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783}
4784
4785void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4786{
4787 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4788}
4789
4790void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4791{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004792 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 +00004793 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004794
4795 try
4796 {
4797 switch (face)
4798 {
4799 case GL_FRONT:
4800 case GL_BACK:
4801 case GL_FRONT_AND_BACK:
4802 break;
4803 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004804 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004805 }
4806
4807 switch (fail)
4808 {
4809 case GL_ZERO:
4810 case GL_KEEP:
4811 case GL_REPLACE:
4812 case GL_INCR:
4813 case GL_DECR:
4814 case GL_INVERT:
4815 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004816 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817 break;
4818 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004819 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820 }
4821
4822 switch (zfail)
4823 {
4824 case GL_ZERO:
4825 case GL_KEEP:
4826 case GL_REPLACE:
4827 case GL_INCR:
4828 case GL_DECR:
4829 case GL_INVERT:
4830 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004831 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832 break;
4833 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004834 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836
4837 switch (zpass)
4838 {
4839 case GL_ZERO:
4840 case GL_KEEP:
4841 case GL_REPLACE:
4842 case GL_INCR:
4843 case GL_DECR:
4844 case GL_INVERT:
4845 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004846 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 break;
4848 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004849 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004850 }
4851
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853
4854 if (context)
4855 {
4856 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4857 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004858 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004859 }
4860
4861 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4862 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004863 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004864 }
4865 }
4866 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004867 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870 }
4871}
4872
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004873GLboolean __stdcall glTestFenceNV(GLuint fence)
4874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004875 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004876
4877 try
4878 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004879 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004880
4881 if (context)
4882 {
Jamie Madill33dc8432013-07-26 11:55:05 -04004883 gl::FenceNV *fenceObject = context->getFenceNV(fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004884
4885 if (fenceObject == NULL)
4886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004887 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004888 }
4889
Jamie Madillfb9a7402013-07-26 11:55:01 -04004890 if (fenceObject->isFence() != GL_TRUE)
4891 {
4892 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4893 }
4894
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004895 return fenceObject->testFence();
4896 }
4897 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004898 catch (...)
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004900 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004901 }
4902
4903 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004904}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004905
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004906void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4907 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004908{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004909 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05004910 "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 +00004911 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004912
4913 try
4914 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004915 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916
4917 if (context)
4918 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004919 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004920 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004921 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004922 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004923 return;
4924 }
4925
4926 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004927 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04004928 0, 0, 0, width, height, 1, border, format, type, pixels))
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004929 {
4930 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00004931 }
4932
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004933 switch (target)
4934 {
4935 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004936 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004937 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04004938 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004939 }
4940 break;
4941 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004942 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004943 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004944 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004946 break;
4947 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4948 {
4949 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004950 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004951 }
4952 break;
4953 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4954 {
4955 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004956 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004957 }
4958 break;
4959 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4960 {
4961 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004962 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004963 }
4964 break;
4965 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4966 {
4967 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004968 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004969 }
4970 break;
4971 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4972 {
4973 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04004974 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00004975 }
4976 break;
4977 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004978 }
4979 }
4980 }
Jamie Madillde0ec752014-05-05 15:10:38 -04004981 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004983 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984 }
4985}
4986
4987void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4988{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004989 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4990
4991 try
4992 {
4993 gl::Context *context = gl::getNonLostContext();
4994
4995 if (context)
4996 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04004997 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madill478fdb22013-07-19 16:36:59 -04004998 {
4999 return;
5000 }
5001
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005002 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005003
Jamie Madillfb8a8302013-07-03 14:24:12 -04005004 if (!texture)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005006 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005007 }
5008
5009 switch (pname)
5010 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005011 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5012 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5013 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5014 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5015 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5016 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005017 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005018 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5019 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005020 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5021 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5022 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5023 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005024 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
5025 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
5026 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
5027 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005028 default: UNREACHABLE(); break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005029 }
5030 }
5031 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005032 catch (...)
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005034 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005035 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036}
5037
5038void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5039{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005040 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041}
5042
5043void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005045 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046
5047 try
5048 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005050
5051 if (context)
5052 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005053 if (!ValidateTexParamParameters(context, pname, param))
Jamie Madill478fdb22013-07-19 16:36:59 -04005054 {
5055 return;
5056 }
5057
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05005058 gl::Texture *texture = context->getTargetTexture(target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005059
Jamie Madillfb8a8302013-07-03 14:24:12 -04005060 if (!texture)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005062 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063 }
5064
5065 switch (pname)
5066 {
Jamie Madill478fdb22013-07-19 16:36:59 -04005067 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5068 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5069 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5070 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5071 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5072 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5073 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5074 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5075 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
Geoff Langbc90a482013-09-17 16:51:27 -04005076 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5077 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5078 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5079 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
Nicolas Capens8de68282014-04-04 11:10:27 -04005080 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5081 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5082 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5083 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
Jamie Madill478fdb22013-07-19 16:36:59 -04005084 default: UNREACHABLE(); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086 }
5087 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005088 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005090 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005091 }
5092}
5093
5094void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5095{
5096 glTexParameteri(target, pname, *params);
5097}
5098
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005099void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5100{
5101 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5102 target, levels, internalformat, width, height);
5103
5104 try
5105 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005106 gl::Context *context = gl::getNonLostContext();
5107
5108 if (context)
5109 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005110 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005111 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005112 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005113 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005114 }
5115
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005116 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005117 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005118 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005119 return;
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005120 }
5121
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005122 switch (target)
5123 {
5124 case GL_TEXTURE_2D:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005125 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005126 gl::Texture2D *texture2d = context->getTexture2D();
5127 texture2d->storage(levels, internalformat, width, height);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005128 }
5129 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005130
Geoff Lang01c21d22013-09-24 11:52:16 -04005131 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005132 {
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005133 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5134 textureCube->storage(levels, internalformat, width);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005135 }
5136 break;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00005137
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005139 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005140 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005141 }
5142 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005143 catch (...)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005145 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005146 }
5147}
5148
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005149void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5150 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005152 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005153 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005154 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005155 target, level, xoffset, yoffset, width, height, format, type, pixels);
5156
5157 try
5158 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005160
5161 if (context)
5162 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005163 if (context->getClientVersion() < 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005164 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005165 xoffset, yoffset, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005166 {
5167 return;
5168 }
5169
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005170 if (context->getClientVersion() >= 3 &&
Geoff Lang34dbb6f2013-08-05 15:05:47 -04005171 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
Jamie Madillf67115c2014-04-22 13:14:05 -04005172 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005173 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005174 return;
5175 }
5176
Geoff Langc41e42d2014-04-28 10:58:16 -04005177 // Zero sized uploads are valid but no-ops
5178 if (width == 0 || height == 0)
5179 {
5180 return;
5181 }
5182
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005183 switch (target)
5184 {
5185 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005186 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005187 gl::Texture2D *texture = context->getTexture2D();
Jamie Madill88f18f42013-09-18 14:36:19 -04005188 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005189 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005190 break;
5191
5192 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5193 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5194 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5195 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5196 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5197 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005198 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005199 gl::TextureCubeMap *texture = context->getTextureCubeMap();
Jamie Madill88f18f42013-09-18 14:36:19 -04005200 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005201 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00005202 break;
5203
5204 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04005205 UNREACHABLE();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005206 }
5207 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005209 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 }
5213}
5214
5215void __stdcall glUniform1f(GLint location, GLfloat x)
5216{
5217 glUniform1fv(location, 1, &x);
5218}
5219
5220void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5221{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005222 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* 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.com4f39fd92010-03-08 20:26:45 +00005227
5228 if (context)
5229 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005230 if (!ValidateUniform(context, GL_FLOAT, 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->setUniform1fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005237 }
5238 }
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 glUniform1i(GLint location, GLint x)
5246{
5247 glUniform1iv(location, 1, &x);
5248}
5249
5250void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005252 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253
5254 try
5255 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257
5258 if (context)
5259 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005260 if (!ValidateUniform(context, GL_INT, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005261 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005262 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005263 }
5264
Jamie Madillaa981bd2014-05-20 10:55:55 -04005265 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005266 programBinary->setUniform1iv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267 }
5268 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005269 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005271 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273}
5274
5275void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5276{
5277 GLfloat xy[2] = {x, y};
5278
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005279 glUniform2fv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005280}
5281
5282void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5283{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005284 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005285
5286 try
5287 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005289
5290 if (context)
5291 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005292 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005293 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005294 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005295 }
5296
Jamie Madillaa981bd2014-05-20 10:55:55 -04005297 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005298 programBinary->setUniform2fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005299 }
5300 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005301 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005303 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005304 }
5305}
5306
5307void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5308{
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005309 GLint xy[2] = {x, y};
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005310
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005311 glUniform2iv(location, 1, xy);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005312}
5313
5314void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005316 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005317
5318 try
5319 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005320 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005321
5322 if (context)
5323 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005324 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005325 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005326 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005327 }
5328
Jamie Madillaa981bd2014-05-20 10:55:55 -04005329 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005330 programBinary->setUniform2iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005332 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005333 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 }
5337}
5338
5339void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5340{
5341 GLfloat xyz[3] = {x, y, z};
5342
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005343 glUniform3fv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344}
5345
5346void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005348 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005349
5350 try
5351 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353
5354 if (context)
5355 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005356 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005357 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005358 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005359 }
5360
Jamie Madillaa981bd2014-05-20 10:55:55 -04005361 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005362 programBinary->setUniform3fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005363 }
5364 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005365 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368 }
5369}
5370
5371void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5372{
5373 GLint xyz[3] = {x, y, z};
5374
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005375 glUniform3iv(location, 1, xyz);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376}
5377
5378void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005380 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005381
5382 try
5383 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005385
5386 if (context)
5387 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005388 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005389 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005390 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005391 }
5392
Jamie Madillaa981bd2014-05-20 10:55:55 -04005393 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005394 programBinary->setUniform3iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005395 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005396 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005397 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401}
5402
5403void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5404{
5405 GLfloat xyzw[4] = {x, y, z, w};
5406
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005407 glUniform4fv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005408}
5409
5410void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005412 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413
5414 try
5415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417
5418 if (context)
5419 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005420 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005421 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005422 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005423 }
5424
Jamie Madillaa981bd2014-05-20 10:55:55 -04005425 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005426 programBinary->setUniform4fv(location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427 }
5428 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005429 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 }
5433}
5434
5435void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5436{
5437 GLint xyzw[4] = {x, y, z, w};
5438
Geoff Lang3b3ad1f2014-03-05 14:35:01 -05005439 glUniform4iv(location, 1, xyzw);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005440}
5441
5442void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005444 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445
5446 try
5447 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005449
5450 if (context)
5451 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005452 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005453 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04005454 return;
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005455 }
5456
Jamie Madillaa981bd2014-05-20 10:55:55 -04005457 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005458 programBinary->setUniform4iv(location, count, v);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005459 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005461 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464 }
5465}
5466
5467void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5468{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005469 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005470 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005471
5472 try
5473 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005474 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475
5476 if (context)
5477 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005478 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005479 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005480 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005481 }
5482
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005483 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005484 programBinary->setUniformMatrix2fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005485 }
5486 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005487 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490 }
5491}
5492
5493void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5494{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005495 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005496 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005497
5498 try
5499 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005501
5502 if (context)
5503 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005504 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005505 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005506 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005507 }
5508
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005509 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005510 programBinary->setUniformMatrix3fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005511 }
5512 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005513 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 }
5517}
5518
5519void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5520{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005521 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005522 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005523
5524 try
5525 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005526 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527
5528 if (context)
5529 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005530 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005531 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04005532 return;
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00005533 }
5534
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005535 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04005536 programBinary->setUniformMatrix4fv(location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537 }
5538 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005539 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005541 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 }
5543}
5544
5545void __stdcall glUseProgram(GLuint program)
5546{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005547 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005548
5549 try
5550 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005551 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552
5553 if (context)
5554 {
5555 gl::Program *programObject = context->getProgram(program);
5556
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005557 if (!programObject && program != 0)
5558 {
5559 if (context->getShader(program))
5560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005561 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005562 }
5563 else
5564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00005566 }
5567 }
5568
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005569 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005571 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572 }
5573
5574 context->useProgram(program);
5575 }
5576 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005577 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005579 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005580 }
5581}
5582
5583void __stdcall glValidateProgram(GLuint program)
5584{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005585 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586
5587 try
5588 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005590
5591 if (context)
5592 {
5593 gl::Program *programObject = context->getProgram(program);
5594
5595 if (!programObject)
5596 {
5597 if (context->getShader(program))
5598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005599 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005600 }
5601 else
5602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005603 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005604 }
5605 }
5606
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00005607 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00005608 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005610 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005612 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613 }
5614}
5615
5616void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005618 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005619
5620 try
5621 {
5622 if (index >= gl::MAX_VERTEX_ATTRIBS)
5623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005624 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005625 }
5626
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005627 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005628
5629 if (context)
5630 {
5631 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005632 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005635 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005638 }
5639}
5640
5641void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005643 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005644
5645 try
5646 {
5647 if (index >= gl::MAX_VERTEX_ATTRIBS)
5648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650 }
5651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005653
5654 if (context)
5655 {
5656 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005657 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005658 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005660 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005662 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005663 }
5664}
5665
5666void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005668 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005669
5670 try
5671 {
5672 if (index >= gl::MAX_VERTEX_ATTRIBS)
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005675 }
5676
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005677 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005678
5679 if (context)
5680 {
5681 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005682 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005683 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005685 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 }
5689}
5690
5691void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005693 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694
5695 try
5696 {
5697 if (index >= gl::MAX_VERTEX_ATTRIBS)
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005703
5704 if (context)
5705 {
5706 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005707 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005710 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713 }
5714}
5715
5716void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005718 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 +00005719
5720 try
5721 {
5722 if (index >= gl::MAX_VERTEX_ATTRIBS)
5723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005725 }
5726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005728
5729 if (context)
5730 {
5731 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005732 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005733 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005734 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005735 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 }
5739}
5740
5741void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5742{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005743 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005744
5745 try
5746 {
5747 if (index >= gl::MAX_VERTEX_ATTRIBS)
5748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005750 }
5751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005753
5754 if (context)
5755 {
5756 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005757 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005758 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005760 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005763 }
5764}
5765
5766void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005768 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 +00005769
5770 try
5771 {
5772 if (index >= gl::MAX_VERTEX_ATTRIBS)
5773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005775 }
5776
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005777 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005778
5779 if (context)
5780 {
5781 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005782 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005783 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005784 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005785 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005788 }
5789}
5790
5791void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005793 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005794
5795 try
5796 {
5797 if (index >= gl::MAX_VERTEX_ATTRIBS)
5798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800 }
5801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005803
5804 if (context)
5805 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005806 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00005807 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005808 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005809 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812 }
5813}
5814
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005815void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5816{
5817 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5818
5819 try
5820 {
5821 if (index >= gl::MAX_VERTEX_ATTRIBS)
5822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005824 }
5825
5826 gl::Context *context = gl::getNonLostContext();
5827
5828 if (context)
5829 {
5830 context->setVertexAttribDivisor(index, divisor);
5831 }
5832 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005833 catch (...)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005836 }
5837}
5838
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005839void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005841 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005842 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005843 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005844
5845 try
5846 {
5847 if (index >= gl::MAX_VERTEX_ATTRIBS)
5848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005850 }
5851
5852 if (size < 1 || size > 4)
5853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005857 gl::Context *context = gl::getNonLostContext();
5858
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 switch (type)
5860 {
5861 case GL_BYTE:
5862 case GL_UNSIGNED_BYTE:
5863 case GL_SHORT:
5864 case GL_UNSIGNED_SHORT:
5865 case GL_FIXED:
5866 case GL_FLOAT:
5867 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005868 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00005869 case GL_INT:
5870 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005871 case GL_INT_2_10_10_10_REV:
5872 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00005873 if (context && context->getClientVersion() < 3)
5874 {
5875 return gl::error(GL_INVALID_ENUM);
5876 }
5877 else
5878 {
5879 break;
5880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005882 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005883 }
5884
5885 if (stride < 0)
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005888 }
5889
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00005890 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5891 {
5892 return gl::error(GL_INVALID_OPERATION);
5893 }
5894
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005895 if (context)
5896 {
Jamie Madilld8db8662013-07-02 11:57:04 -04005897 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5898 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5899 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5900 // and the pointer argument is not NULL.
5901 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5902 {
5903 return gl::error(GL_INVALID_OPERATION);
5904 }
5905
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00005906 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5907 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005908 }
5909 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005910 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005912 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005913 }
5914}
5915
5916void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5917{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005918 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 +00005919
5920 try
5921 {
5922 if (width < 0 || height < 0)
5923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005924 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005925 }
5926
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005927 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928
5929 if (context)
5930 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005931 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932 }
5933 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005934 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 }
5938}
5939
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005940// OpenGL ES 3.0 functions
5941
5942void __stdcall glReadBuffer(GLenum mode)
5943{
5944 EVENT("(GLenum mode = 0x%X)", mode);
5945
5946 try
5947 {
5948 gl::Context *context = gl::getNonLostContext();
5949
5950 if (context)
5951 {
5952 if (context->getClientVersion() < 3)
5953 {
5954 return gl::error(GL_INVALID_OPERATION);
5955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005956
Jamie Madill54133512013-06-21 09:33:07 -04005957 // glReadBuffer
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005958 UNIMPLEMENTED();
5959 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005960 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005961 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005962 {
5963 return gl::error(GL_OUT_OF_MEMORY);
5964 }
5965}
5966
5967void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5968{
5969 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5970 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5971
5972 try
5973 {
5974 gl::Context *context = gl::getNonLostContext();
5975
5976 if (context)
5977 {
5978 if (context->getClientVersion() < 3)
5979 {
5980 return gl::error(GL_INVALID_OPERATION);
5981 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005982
Jamie Madill54133512013-06-21 09:33:07 -04005983 // glDrawRangeElements
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00005984 UNIMPLEMENTED();
5985 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005986 }
Jamie Madillde0ec752014-05-05 15:10:38 -04005987 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005988 {
5989 return gl::error(GL_OUT_OF_MEMORY);
5990 }
5991}
5992
5993void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5994{
5995 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5996 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5997 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5998 target, level, internalformat, width, height, depth, border, format, type, pixels);
5999
6000 try
6001 {
6002 gl::Context *context = gl::getNonLostContext();
6003
6004 if (context)
6005 {
6006 if (context->getClientVersion() < 3)
6007 {
6008 return gl::error(GL_INVALID_OPERATION);
6009 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006010
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006011 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006012 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006013 0, 0, 0, width, height, depth, border, format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006014 {
6015 return;
6016 }
6017
6018 switch(target)
6019 {
6020 case GL_TEXTURE_3D:
6021 {
6022 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006023 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006024 }
6025 break;
6026
6027 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006028 {
6029 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006030 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006031 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006032 break;
6033
6034 default:
6035 return gl::error(GL_INVALID_ENUM);
6036 }
6037 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006038 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006039 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006040 {
6041 return gl::error(GL_OUT_OF_MEMORY);
6042 }
6043}
6044
6045void __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)
6046{
6047 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6048 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6049 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6050 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6051
6052 try
6053 {
6054 gl::Context *context = gl::getNonLostContext();
6055
6056 if (context)
6057 {
6058 if (context->getClientVersion() < 3)
6059 {
6060 return gl::error(GL_INVALID_OPERATION);
6061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006062
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006063 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006064 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006065 xoffset, yoffset, zoffset, width, height, depth, 0,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006066 format, type, pixels))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006067 {
6068 return;
6069 }
6070
Geoff Langc41e42d2014-04-28 10:58:16 -04006071 // Zero sized uploads are valid but no-ops
6072 if (width == 0 || height == 0 || depth == 0)
6073 {
6074 return;
6075 }
6076
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006077 switch(target)
6078 {
6079 case GL_TEXTURE_3D:
6080 {
6081 gl::Texture3D *texture = context->getTexture3D();
Jamie Madill88f18f42013-09-18 14:36:19 -04006082 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 +00006083 }
6084 break;
6085
6086 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006087 {
6088 gl::Texture2DArray *texture = context->getTexture2DArray();
Jamie Madill88f18f42013-09-18 14:36:19 -04006089 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 +00006090 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006091 break;
6092
6093 default:
6094 return gl::error(GL_INVALID_ENUM);
6095 }
6096 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006097 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006098 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006099 {
6100 return gl::error(GL_OUT_OF_MEMORY);
6101 }
6102}
6103
6104void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6105{
6106 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6107 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6108 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6109
6110 try
6111 {
6112 gl::Context *context = gl::getNonLostContext();
6113
6114 if (context)
6115 {
6116 if (context->getClientVersion() < 3)
6117 {
6118 return gl::error(GL_INVALID_OPERATION);
6119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006120
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006121 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00006122 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006123 {
6124 return;
6125 }
6126
Geoff Langc41e42d2014-04-28 10:58:16 -04006127 // Zero sized copies are valid but no-ops
6128 if (width == 0 || height == 0)
6129 {
6130 return;
6131 }
6132
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006133 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6134 gl::Texture *texture = NULL;
6135 switch (target)
6136 {
6137 case GL_TEXTURE_3D:
6138 texture = context->getTexture3D();
6139 break;
6140
6141 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006142 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006143 break;
6144
6145 default:
6146 return gl::error(GL_INVALID_ENUM);
6147 }
6148
6149 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006151 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006152 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006153 {
6154 return gl::error(GL_OUT_OF_MEMORY);
6155 }
6156}
6157
6158void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6159{
Geoff Langeef52cc2013-10-16 15:07:39 -04006160 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 +00006161 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6162 "const GLvoid* data = 0x%0.8p)",
6163 target, level, internalformat, width, height, depth, border, imageSize, data);
6164
6165 try
6166 {
6167 gl::Context *context = gl::getNonLostContext();
6168
6169 if (context)
6170 {
6171 if (context->getClientVersion() < 3)
6172 {
6173 return gl::error(GL_INVALID_OPERATION);
6174 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006175
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006176 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 +00006177 {
6178 return gl::error(GL_INVALID_VALUE);
6179 }
6180
6181 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006182 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006183 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006184 {
6185 return;
6186 }
6187
6188 switch(target)
6189 {
6190 case GL_TEXTURE_3D:
6191 {
6192 gl::Texture3D *texture = context->getTexture3D();
6193 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6194 }
6195 break;
6196
6197 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006198 {
6199 gl::Texture2DArray *texture = context->getTexture2DArray();
6200 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6201 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006202 break;
6203
6204 default:
6205 return gl::error(GL_INVALID_ENUM);
6206 }
6207 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006208 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006209 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006210 {
6211 return gl::error(GL_OUT_OF_MEMORY);
6212 }
6213}
6214
6215void __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)
6216{
6217 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6218 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6219 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6220 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6221
6222 try
6223 {
6224 gl::Context *context = gl::getNonLostContext();
6225
6226 if (context)
6227 {
6228 if (context->getClientVersion() < 3)
6229 {
6230 return gl::error(GL_INVALID_OPERATION);
6231 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006232
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006233 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 +00006234 {
6235 return gl::error(GL_INVALID_VALUE);
6236 }
6237
6238 if (!data)
6239 {
6240 return gl::error(GL_INVALID_VALUE);
6241 }
6242
6243 // validateES3TexImageFormat sets the error code if there is an error
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006244 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
Jamie Madillefb2a6f2013-09-24 10:22:42 -04006245 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006246 {
6247 return;
6248 }
6249
Geoff Langc41e42d2014-04-28 10:58:16 -04006250 // Zero sized uploads are valid but no-ops
6251 if (width == 0 || height == 0)
6252 {
6253 return;
6254 }
6255
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006256 switch(target)
6257 {
6258 case GL_TEXTURE_3D:
6259 {
6260 gl::Texture3D *texture = context->getTexture3D();
6261 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6262 format, imageSize, data);
6263 }
6264 break;
6265
6266 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00006267 {
6268 gl::Texture2DArray *texture = context->getTexture2DArray();
6269 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6270 format, imageSize, data);
6271 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00006272 break;
6273
6274 default:
6275 return gl::error(GL_INVALID_ENUM);
6276 }
6277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006278 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006279 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006280 {
6281 return gl::error(GL_OUT_OF_MEMORY);
6282 }
6283}
6284
6285void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6286{
6287 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6288
6289 try
6290 {
6291 gl::Context *context = gl::getNonLostContext();
6292
6293 if (context)
6294 {
6295 if (context->getClientVersion() < 3)
6296 {
6297 return gl::error(GL_INVALID_OPERATION);
6298 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006299
Geoff Lang37dde692014-01-31 16:34:54 -05006300 if (n < 0)
6301 {
6302 return gl::error(GL_INVALID_VALUE);
6303 }
6304
6305 for (GLsizei i = 0; i < n; i++)
6306 {
6307 ids[i] = context->createQuery();
6308 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006309 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006310 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006311 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006312 {
6313 return gl::error(GL_OUT_OF_MEMORY);
6314 }
6315}
6316
6317void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6318{
6319 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6320
6321 try
6322 {
6323 gl::Context *context = gl::getNonLostContext();
6324
6325 if (context)
6326 {
6327 if (context->getClientVersion() < 3)
6328 {
6329 return gl::error(GL_INVALID_OPERATION);
6330 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006331
Geoff Lang37dde692014-01-31 16:34:54 -05006332 if (n < 0)
6333 {
6334 return gl::error(GL_INVALID_VALUE);
6335 }
6336
6337 for (GLsizei i = 0; i < n; i++)
6338 {
6339 context->deleteQuery(ids[i]);
6340 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006342 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006343 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006344 {
6345 return gl::error(GL_OUT_OF_MEMORY);
6346 }
6347}
6348
6349GLboolean __stdcall glIsQuery(GLuint id)
6350{
6351 EVENT("(GLuint id = %u)", id);
6352
6353 try
6354 {
6355 gl::Context *context = gl::getNonLostContext();
6356
6357 if (context)
6358 {
6359 if (context->getClientVersion() < 3)
6360 {
6361 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006363
Geoff Lang37dde692014-01-31 16:34:54 -05006364 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006365 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006366 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006367 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006368 {
6369 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6370 }
6371
6372 return GL_FALSE;
6373}
6374
6375void __stdcall glBeginQuery(GLenum target, GLuint id)
6376{
6377 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6378
6379 try
6380 {
6381 gl::Context *context = gl::getNonLostContext();
6382
6383 if (context)
6384 {
6385 if (context->getClientVersion() < 3)
6386 {
6387 return gl::error(GL_INVALID_OPERATION);
6388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006389
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006390 if (!ValidateBeginQuery(context, target, id))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006391 {
Jamie Madilldb2f14c2014-05-13 13:56:30 -04006392 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006393 }
Geoff Lang37dde692014-01-31 16:34:54 -05006394 context->beginQuery(target, id);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006395 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006396 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006397 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006398 {
6399 return gl::error(GL_OUT_OF_MEMORY);
6400 }
6401}
6402
6403void __stdcall glEndQuery(GLenum target)
6404{
6405 EVENT("(GLenum target = 0x%X)", target);
6406
6407 try
6408 {
6409 gl::Context *context = gl::getNonLostContext();
6410
6411 if (context)
6412 {
6413 if (context->getClientVersion() < 3)
6414 {
6415 return gl::error(GL_INVALID_OPERATION);
6416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006417
Jamie Madill45c785d2014-05-13 14:09:34 -04006418 if (!ValidateEndQuery(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006419 {
Jamie Madill45c785d2014-05-13 14:09:34 -04006420 return;
Jamie Madill3641b4b2013-07-26 12:54:59 -04006421 }
Geoff Lang37dde692014-01-31 16:34:54 -05006422
6423 context->endQuery(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006424 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006425 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006426 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006427 {
6428 return gl::error(GL_OUT_OF_MEMORY);
6429 }
6430}
6431
6432void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6433{
6434 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6435
6436 try
6437 {
6438 gl::Context *context = gl::getNonLostContext();
6439
6440 if (context)
6441 {
6442 if (context->getClientVersion() < 3)
6443 {
6444 return gl::error(GL_INVALID_OPERATION);
6445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006446
Geoff Lang37dde692014-01-31 16:34:54 -05006447 if (!ValidQueryType(context, target))
Jamie Madill3641b4b2013-07-26 12:54:59 -04006448 {
Geoff Lang37dde692014-01-31 16:34:54 -05006449 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006450 }
Geoff Lang37dde692014-01-31 16:34:54 -05006451
6452 switch (pname)
Jamie Madill3641b4b2013-07-26 12:54:59 -04006453 {
Geoff Lang37dde692014-01-31 16:34:54 -05006454 case GL_CURRENT_QUERY:
Jamie Madill45c785d2014-05-13 14:09:34 -04006455 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
Geoff Lang37dde692014-01-31 16:34:54 -05006456 break;
6457
6458 default:
6459 return gl::error(GL_INVALID_ENUM);
Jamie Madill3641b4b2013-07-26 12:54:59 -04006460 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006461 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006462 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006463 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006464 {
6465 return gl::error(GL_OUT_OF_MEMORY);
6466 }
6467}
6468
6469void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6470{
6471 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6472
6473 try
6474 {
6475 gl::Context *context = gl::getNonLostContext();
6476
6477 if (context)
6478 {
6479 if (context->getClientVersion() < 3)
6480 {
6481 return gl::error(GL_INVALID_OPERATION);
6482 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006483
Geoff Lang37dde692014-01-31 16:34:54 -05006484 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6485
6486 if (!queryObject)
6487 {
6488 return gl::error(GL_INVALID_OPERATION);
6489 }
6490
Jamie Madill45c785d2014-05-13 14:09:34 -04006491 if (context->getActiveQueryId(queryObject->getType()) == id)
Geoff Lang37dde692014-01-31 16:34:54 -05006492 {
6493 return gl::error(GL_INVALID_OPERATION);
6494 }
6495
6496 switch(pname)
6497 {
6498 case GL_QUERY_RESULT:
6499 params[0] = queryObject->getResult();
6500 break;
6501 case GL_QUERY_RESULT_AVAILABLE:
6502 params[0] = queryObject->isResultAvailable();
6503 break;
6504 default:
6505 return gl::error(GL_INVALID_ENUM);
6506 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006507 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006508 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006509 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006510 {
6511 return gl::error(GL_OUT_OF_MEMORY);
6512 }
6513}
6514
6515GLboolean __stdcall glUnmapBuffer(GLenum target)
6516{
6517 EVENT("(GLenum target = 0x%X)", target);
6518
6519 try
6520 {
6521 gl::Context *context = gl::getNonLostContext();
6522
6523 if (context)
6524 {
6525 if (context->getClientVersion() < 3)
6526 {
6527 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6528 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006529
Shannon Woodsb3801742014-03-27 14:59:19 -04006530 return glUnmapBufferOES(target);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +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, GL_FALSE);
6536 }
6537
6538 return GL_FALSE;
6539}
6540
6541void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6542{
6543 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6544
6545 try
6546 {
6547 gl::Context *context = gl::getNonLostContext();
6548
6549 if (context)
6550 {
6551 if (context->getClientVersion() < 3)
6552 {
6553 return gl::error(GL_INVALID_OPERATION);
6554 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006555
Shannon Woodsb3801742014-03-27 14:59:19 -04006556 glGetBufferPointervOES(target, pname, params);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +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 glDrawBuffers(GLsizei n, const GLenum* bufs)
6566{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006567 try
6568 {
6569 gl::Context *context = gl::getNonLostContext();
6570
6571 if (context)
6572 {
6573 if (context->getClientVersion() < 3)
6574 {
6575 return gl::error(GL_INVALID_OPERATION);
6576 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006577
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00006578 glDrawBuffersEXT(n, bufs);
6579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006581 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006582 {
6583 return gl::error(GL_OUT_OF_MEMORY);
6584 }
6585}
6586
6587void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6588{
6589 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6590 location, count, transpose, value);
6591
6592 try
6593 {
6594 gl::Context *context = gl::getNonLostContext();
6595
6596 if (context)
6597 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006598 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006599 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006600 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006601 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006602
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006603 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006604 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006605 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006606 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006607 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006608 {
6609 return gl::error(GL_OUT_OF_MEMORY);
6610 }
6611}
6612
6613void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6614{
6615 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6616 location, count, transpose, value);
6617
6618 try
6619 {
6620 gl::Context *context = gl::getNonLostContext();
6621
6622 if (context)
6623 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006624 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006625 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006626 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006627 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006628
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006629 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006630 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006632 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006633 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006634 {
6635 return gl::error(GL_OUT_OF_MEMORY);
6636 }
6637}
6638
6639void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6640{
6641 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6642 location, count, transpose, value);
6643
6644 try
6645 {
6646 gl::Context *context = gl::getNonLostContext();
6647
6648 if (context)
6649 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006650 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006651 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006652 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006653 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006654
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006655 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006656 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006657 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006658 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006659 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006660 {
6661 return gl::error(GL_OUT_OF_MEMORY);
6662 }
6663}
6664
6665void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6666{
6667 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6668 location, count, transpose, value);
6669
6670 try
6671 {
6672 gl::Context *context = gl::getNonLostContext();
6673
6674 if (context)
6675 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006676 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006677 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006678 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006680
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006681 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006682 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006684 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006685 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006686 {
6687 return gl::error(GL_OUT_OF_MEMORY);
6688 }
6689}
6690
6691void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6692{
6693 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6694 location, count, transpose, value);
6695
6696 try
6697 {
6698 gl::Context *context = gl::getNonLostContext();
6699
6700 if (context)
6701 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006702 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006703 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006704 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006706
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006707 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006708 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006710 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006711 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006712 {
6713 return gl::error(GL_OUT_OF_MEMORY);
6714 }
6715}
6716
6717void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6718{
6719 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6720 location, count, transpose, value);
6721
6722 try
6723 {
6724 gl::Context *context = gl::getNonLostContext();
6725
6726 if (context)
6727 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006728 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006729 {
Jamie Madilld7c7bb22014-05-20 10:55:54 -04006730 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006732
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006733 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04006734 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00006735 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006736 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006737 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006738 {
6739 return gl::error(GL_OUT_OF_MEMORY);
6740 }
6741}
6742
6743void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6744{
6745 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6746 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6747 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6748
6749 try
6750 {
6751 gl::Context *context = gl::getNonLostContext();
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006752 if (context)
6753 {
6754 if (context->getClientVersion() < 3)
6755 {
6756 return gl::error(GL_INVALID_OPERATION);
6757 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006758
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006759 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04006760 dstX0, dstY0, dstX1, dstY1, mask, filter,
6761 false))
6762 {
6763 return;
6764 }
6765
6766 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6767 mask, filter);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006768 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006769 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006770 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006771 {
6772 return gl::error(GL_OUT_OF_MEMORY);
6773 }
6774}
6775
6776void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6777{
6778 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6779 target, samples, internalformat, width, height);
6780
6781 try
6782 {
6783 gl::Context *context = gl::getNonLostContext();
6784
6785 if (context)
6786 {
6787 if (context->getClientVersion() < 3)
6788 {
6789 return gl::error(GL_INVALID_OPERATION);
6790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006791
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006792 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
Geoff Lang2e1dcd52013-05-29 10:34:08 -04006793 width, height, false))
6794 {
6795 return;
6796 }
6797
6798 context->setRenderbufferStorage(width, height, internalformat, samples);
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 glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6808{
6809 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6810 target, attachment, texture, level, layer);
6811
6812 try
6813 {
6814 gl::Context *context = gl::getNonLostContext();
6815
6816 if (context)
6817 {
6818 if (context->getClientVersion() < 3)
6819 {
6820 return gl::error(GL_INVALID_OPERATION);
6821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006822
Geoff Lang34dbb6f2013-08-05 15:05:47 -04006823 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
Geoff Lang3ed0c482013-07-25 17:03:18 -04006824 {
6825 return;
6826 }
6827
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05006828 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6829 ASSERT(framebuffer);
Geoff Lang3ed0c482013-07-25 17:03:18 -04006830
6831 gl::Texture *textureObject = context->getTexture(texture);
6832 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6833
6834 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6835 {
6836 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6837 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6838 }
6839 else
6840 {
6841 switch (attachment)
6842 {
6843 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6844 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6845 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6846 }
6847 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006849 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006850 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006851 {
6852 return gl::error(GL_OUT_OF_MEMORY);
6853 }
6854}
6855
6856GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6857{
6858 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6859 target, offset, length, access);
6860
6861 try
6862 {
6863 gl::Context *context = gl::getNonLostContext();
6864
6865 if (context)
6866 {
6867 if (context->getClientVersion() < 3)
6868 {
6869 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006871
Shannon Woods916e7692014-03-27 16:58:22 -04006872 return glMapBufferRangeEXT(target, offset, length, access);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006874 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006875 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006876 {
6877 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6878 }
6879
6880 return NULL;
6881}
6882
6883void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6884{
6885 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6886
6887 try
6888 {
6889 gl::Context *context = gl::getNonLostContext();
6890
6891 if (context)
6892 {
6893 if (context->getClientVersion() < 3)
6894 {
6895 return gl::error(GL_INVALID_OPERATION);
6896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006897
Shannon Woods916e7692014-03-27 16:58:22 -04006898 glFlushMappedBufferRangeEXT(target, offset, length);
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
6907void __stdcall glBindVertexArray(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);
6920 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006921
Jamie Madilld1028542013-07-02 11:57:04 -04006922 gl::VertexArray *vao = context->getVertexArray(array);
6923
6924 if (!vao)
6925 {
6926 // The default VAO should always exist
6927 ASSERT(array != 0);
6928 return gl::error(GL_INVALID_OPERATION);
6929 }
6930
6931 context->bindVertexArray(array);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006932 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006933 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006934 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006935 {
6936 return gl::error(GL_OUT_OF_MEMORY);
6937 }
6938}
6939
6940void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6941{
6942 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6943
6944 try
6945 {
6946 gl::Context *context = gl::getNonLostContext();
6947
6948 if (context)
6949 {
6950 if (context->getClientVersion() < 3)
6951 {
6952 return gl::error(GL_INVALID_OPERATION);
6953 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006954
Jamie Madilld1028542013-07-02 11:57:04 -04006955 if (n < 0)
6956 {
6957 return gl::error(GL_INVALID_VALUE);
6958 }
6959
6960 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6961 {
6962 if (arrays[arrayIndex] != 0)
6963 {
6964 context->deleteVertexArray(arrays[arrayIndex]);
6965 }
6966 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006967 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006968 }
Jamie Madillde0ec752014-05-05 15:10:38 -04006969 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006970 {
6971 return gl::error(GL_OUT_OF_MEMORY);
6972 }
6973}
6974
6975void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6976{
6977 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6978
6979 try
6980 {
6981 gl::Context *context = gl::getNonLostContext();
6982
6983 if (context)
6984 {
6985 if (context->getClientVersion() < 3)
6986 {
6987 return gl::error(GL_INVALID_OPERATION);
6988 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006989
Jamie Madilld1028542013-07-02 11:57:04 -04006990 if (n < 0)
6991 {
6992 return gl::error(GL_INVALID_VALUE);
6993 }
6994
6995 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6996 {
6997 arrays[arrayIndex] = context->createVertexArray();
6998 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00006999 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007000 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007001 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007002 {
7003 return gl::error(GL_OUT_OF_MEMORY);
7004 }
7005}
7006
7007GLboolean __stdcall glIsVertexArray(GLuint array)
7008{
7009 EVENT("(GLuint array = %u)", array);
7010
7011 try
7012 {
7013 gl::Context *context = gl::getNonLostContext();
7014
7015 if (context)
7016 {
7017 if (context->getClientVersion() < 3)
7018 {
7019 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007021
Jamie Madilld1028542013-07-02 11:57:04 -04007022 if (array == 0)
7023 {
7024 return GL_FALSE;
7025 }
7026
7027 gl::VertexArray *vao = context->getVertexArray(array);
7028
7029 return (vao != NULL ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007030 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007031 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007032 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007033 {
7034 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7035 }
7036
7037 return GL_FALSE;
7038}
7039
7040void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7041{
7042 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7043 target, index, data);
7044
7045 try
7046 {
7047 gl::Context *context = gl::getNonLostContext();
7048
7049 if (context)
7050 {
7051 if (context->getClientVersion() < 3)
7052 {
7053 return gl::error(GL_INVALID_OPERATION);
7054 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007055
Shannon Woods15934d52013-08-19 14:28:49 -04007056 switch (target)
7057 {
7058 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7059 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7060 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7061 if (index >= context->getMaxTransformFeedbackBufferBindings())
7062 return gl::error(GL_INVALID_VALUE);
7063 break;
7064 case GL_UNIFORM_BUFFER_START:
7065 case GL_UNIFORM_BUFFER_SIZE:
7066 case GL_UNIFORM_BUFFER_BINDING:
7067 if (index >= context->getMaximumCombinedUniformBufferBindings())
7068 return gl::error(GL_INVALID_VALUE);
7069 break;
7070 default:
7071 return gl::error(GL_INVALID_ENUM);
7072 }
7073
7074 if (!(context->getIndexedIntegerv(target, index, data)))
7075 {
7076 GLenum nativeType;
7077 unsigned int numParams = 0;
7078 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7079 return gl::error(GL_INVALID_ENUM);
7080
7081 if (numParams == 0)
7082 return; // it is known that pname is valid, but there are no parameters to return
7083
7084 if (nativeType == GL_INT_64_ANGLEX)
7085 {
7086 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7087 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7088 GLint64 *int64Params = new GLint64[numParams];
7089
7090 context->getIndexedInteger64v(target, index, int64Params);
7091
7092 for (unsigned int i = 0; i < numParams; ++i)
7093 {
7094 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7095 data[i] = static_cast<GLint>(clampedValue);
7096 }
7097
7098 delete [] int64Params;
7099 }
7100 else
7101 {
7102 UNREACHABLE();
7103 }
7104 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007105 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007106 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007107 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007108 {
7109 return gl::error(GL_OUT_OF_MEMORY);
7110 }
7111}
7112
7113void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7114{
7115 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7116
7117 try
7118 {
7119 gl::Context *context = gl::getNonLostContext();
7120
7121 if (context)
7122 {
7123 if (context->getClientVersion() < 3)
7124 {
7125 return gl::error(GL_INVALID_OPERATION);
7126 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007127
Geoff Langc8058452014-02-03 12:04:11 -05007128 switch (primitiveMode)
7129 {
7130 case GL_TRIANGLES:
7131 case GL_LINES:
7132 case GL_POINTS:
7133 break;
7134 default:
7135 return gl::error(GL_INVALID_ENUM);
7136 }
7137
7138 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7139 ASSERT(transformFeedback != NULL);
7140
7141 if (transformFeedback->isStarted())
7142 {
7143 return gl::error(GL_INVALID_OPERATION);
7144 }
7145
7146 if (transformFeedback->isPaused())
7147 {
7148 transformFeedback->resume();
7149 }
7150 else
7151 {
7152 transformFeedback->start(primitiveMode);
7153 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007154 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007155 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007156 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007157 {
7158 return gl::error(GL_OUT_OF_MEMORY);
7159 }
7160}
7161
7162void __stdcall glEndTransformFeedback(void)
7163{
7164 EVENT("(void)");
7165
7166 try
7167 {
7168 gl::Context *context = gl::getNonLostContext();
7169
7170 if (context)
7171 {
7172 if (context->getClientVersion() < 3)
7173 {
7174 return gl::error(GL_INVALID_OPERATION);
7175 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007176
Geoff Langc8058452014-02-03 12:04:11 -05007177 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7178 ASSERT(transformFeedback != NULL);
7179
7180 if (!transformFeedback->isStarted())
7181 {
7182 return gl::error(GL_INVALID_OPERATION);
7183 }
7184
7185 transformFeedback->stop();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007186 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007187 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007188 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007189 {
7190 return gl::error(GL_OUT_OF_MEMORY);
7191 }
7192}
7193
7194void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7195{
7196 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7197 target, index, buffer, offset, size);
7198
7199 try
7200 {
7201 gl::Context *context = gl::getNonLostContext();
7202
7203 if (context)
7204 {
7205 if (context->getClientVersion() < 3)
7206 {
7207 return gl::error(GL_INVALID_OPERATION);
7208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007209
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007210 switch (target)
7211 {
7212 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007213 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007214 {
7215 return gl::error(GL_INVALID_VALUE);
7216 }
7217 break;
7218
7219 case GL_UNIFORM_BUFFER:
7220 if (index >= context->getMaximumCombinedUniformBufferBindings())
7221 {
7222 return gl::error(GL_INVALID_VALUE);
7223 }
7224 break;
7225
7226 default:
7227 return gl::error(GL_INVALID_ENUM);
7228 }
7229
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00007230 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007231 {
7232 return gl::error(GL_INVALID_VALUE);
7233 }
7234
7235 switch (target)
7236 {
7237 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00007238
7239 // size and offset must be a multiple of 4
7240 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7241 {
7242 return gl::error(GL_INVALID_VALUE);
7243 }
7244
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007245 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7246 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007247 break;
7248
7249 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00007250
7251 // it is an error to bind an offset not a multiple of the alignment
7252 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7253 {
7254 return gl::error(GL_INVALID_VALUE);
7255 }
7256
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007257 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7258 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007259 break;
7260
7261 default:
7262 UNREACHABLE();
7263 }
7264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007265 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007266 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007267 {
7268 return gl::error(GL_OUT_OF_MEMORY);
7269 }
7270}
7271
7272void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7273{
7274 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7275 target, index, buffer);
7276
7277 try
7278 {
7279 gl::Context *context = gl::getNonLostContext();
7280
7281 if (context)
7282 {
7283 if (context->getClientVersion() < 3)
7284 {
7285 return gl::error(GL_INVALID_OPERATION);
7286 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007287
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007288 switch (target)
7289 {
7290 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007291 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007292 {
7293 return gl::error(GL_INVALID_VALUE);
7294 }
7295 break;
7296
7297 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00007298 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007299 {
7300 return gl::error(GL_INVALID_VALUE);
7301 }
7302 break;
7303
7304 default:
7305 return gl::error(GL_INVALID_ENUM);
7306 }
7307
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007308 switch (target)
7309 {
7310 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007311 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007312 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007313 break;
7314
7315 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00007316 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00007317 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00007318 break;
7319
7320 default:
7321 UNREACHABLE();
7322 }
7323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007324 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007325 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007326 {
7327 return gl::error(GL_OUT_OF_MEMORY);
7328 }
7329}
7330
7331void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7332{
7333 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7334 program, count, varyings, bufferMode);
7335
7336 try
7337 {
7338 gl::Context *context = gl::getNonLostContext();
7339
7340 if (context)
7341 {
7342 if (context->getClientVersion() < 3)
7343 {
7344 return gl::error(GL_INVALID_OPERATION);
7345 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007346
Geoff Lang48dcae72014-02-05 16:28:24 -05007347 if (count < 0)
7348 {
7349 return gl::error(GL_INVALID_VALUE);
7350 }
7351
7352 switch (bufferMode)
7353 {
7354 case GL_INTERLEAVED_ATTRIBS:
7355 break;
7356 case GL_SEPARATE_ATTRIBS:
7357 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7358 {
7359 return gl::error(GL_INVALID_VALUE);
7360 }
7361 break;
7362 default:
7363 return gl::error(GL_INVALID_ENUM);
7364 }
7365
7366 if (!gl::ValidProgram(context, program))
7367 {
7368 return;
7369 }
7370
7371 gl::Program *programObject = context->getProgram(program);
7372 ASSERT(programObject);
7373
7374 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007376 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007377 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007378 {
7379 return gl::error(GL_OUT_OF_MEMORY);
7380 }
7381}
7382
7383void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7384{
7385 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7386 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7387 program, index, bufSize, length, size, type, name);
7388
7389 try
7390 {
7391 gl::Context *context = gl::getNonLostContext();
7392
7393 if (context)
7394 {
7395 if (context->getClientVersion() < 3)
7396 {
7397 return gl::error(GL_INVALID_OPERATION);
7398 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007399
Geoff Lang48dcae72014-02-05 16:28:24 -05007400 if (bufSize < 0)
7401 {
7402 return gl::error(GL_INVALID_VALUE);
7403 }
7404
7405 if (!gl::ValidProgram(context, program))
7406 {
7407 return;
7408 }
7409
7410 gl::Program *programObject = context->getProgram(program);
7411 ASSERT(programObject);
7412
7413 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7414 {
7415 return gl::error(GL_INVALID_VALUE);
7416 }
7417
7418 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007419 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007420 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007421 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007422 {
7423 return gl::error(GL_OUT_OF_MEMORY);
7424 }
7425}
7426
7427void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7428{
7429 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7430 index, size, type, stride, pointer);
7431
7432 try
7433 {
7434 gl::Context *context = gl::getNonLostContext();
7435
7436 if (context)
7437 {
7438 if (context->getClientVersion() < 3)
7439 {
7440 return gl::error(GL_INVALID_OPERATION);
7441 }
7442 }
7443
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007444 if (index >= gl::MAX_VERTEX_ATTRIBS)
7445 {
7446 return gl::error(GL_INVALID_VALUE);
7447 }
7448
7449 if (size < 1 || size > 4)
7450 {
7451 return gl::error(GL_INVALID_VALUE);
7452 }
7453
7454 switch (type)
7455 {
7456 case GL_BYTE:
7457 case GL_UNSIGNED_BYTE:
7458 case GL_SHORT:
7459 case GL_UNSIGNED_SHORT:
7460 case GL_INT:
7461 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007462 case GL_INT_2_10_10_10_REV:
7463 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007464 break;
7465 default:
7466 return gl::error(GL_INVALID_ENUM);
7467 }
7468
7469 if (stride < 0)
7470 {
7471 return gl::error(GL_INVALID_VALUE);
7472 }
7473
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007474 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7475 {
7476 return gl::error(GL_INVALID_OPERATION);
7477 }
7478
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007479 if (context)
7480 {
Jamie Madilld8db8662013-07-02 11:57:04 -04007481 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7482 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7483 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7484 // and the pointer argument is not NULL.
7485 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7486 {
7487 return gl::error(GL_INVALID_OPERATION);
7488 }
7489
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007490 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7491 stride, pointer);
7492 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007493 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007494 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007495 {
7496 return gl::error(GL_OUT_OF_MEMORY);
7497 }
7498}
7499
7500void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7501{
7502 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7503 index, pname, params);
7504
7505 try
7506 {
7507 gl::Context *context = gl::getNonLostContext();
7508
7509 if (context)
7510 {
7511 if (context->getClientVersion() < 3)
7512 {
7513 return gl::error(GL_INVALID_OPERATION);
7514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007515
Jamie Madilla7d05862013-07-02 11:57:06 -04007516 if (index >= gl::MAX_VERTEX_ATTRIBS)
7517 {
7518 return gl::error(GL_INVALID_VALUE);
7519 }
7520
7521 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7522
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007523 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007524 {
7525 return;
7526 }
7527
7528 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7529 {
7530 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7531 for (int i = 0; i < 4; ++i)
7532 {
7533 params[i] = currentValueData.IntValues[i];
7534 }
7535 }
7536 else
7537 {
7538 *params = attribState.querySingleParameter<GLint>(pname);
7539 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007540 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007541 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007542 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007543 {
7544 return gl::error(GL_OUT_OF_MEMORY);
7545 }
7546}
7547
7548void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7549{
7550 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7551 index, pname, params);
7552
7553 try
7554 {
7555 gl::Context *context = gl::getNonLostContext();
7556
7557 if (context)
7558 {
7559 if (context->getClientVersion() < 3)
7560 {
7561 return gl::error(GL_INVALID_OPERATION);
7562 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007563
Jamie Madilla7d05862013-07-02 11:57:06 -04007564 if (index >= gl::MAX_VERTEX_ATTRIBS)
7565 {
7566 return gl::error(GL_INVALID_VALUE);
7567 }
7568
7569 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7570
Geoff Lang34dbb6f2013-08-05 15:05:47 -04007571 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
Jamie Madilla7d05862013-07-02 11:57:06 -04007572 {
7573 return;
7574 }
7575
7576 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7577 {
7578 const gl::VertexAttribCurrentValueData &currentValueData = context->getVertexAttribCurrentValue(index);
7579 for (int i = 0; i < 4; ++i)
7580 {
7581 params[i] = currentValueData.UnsignedIntValues[i];
7582 }
7583 }
7584 else
7585 {
7586 *params = attribState.querySingleParameter<GLuint>(pname);
7587 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007588 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007589 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007590 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007591 {
7592 return gl::error(GL_OUT_OF_MEMORY);
7593 }
7594}
7595
7596void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7597{
7598 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7599 index, x, y, z, w);
7600
7601 try
7602 {
7603 gl::Context *context = gl::getNonLostContext();
7604
7605 if (context)
7606 {
7607 if (context->getClientVersion() < 3)
7608 {
7609 return gl::error(GL_INVALID_OPERATION);
7610 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007611
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007612 if (index >= gl::MAX_VERTEX_ATTRIBS)
7613 {
7614 return gl::error(GL_INVALID_VALUE);
7615 }
7616
7617 GLint vals[4] = { x, y, z, w };
7618 context->setVertexAttribi(index, vals);
7619 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007620 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007621 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007622 {
7623 return gl::error(GL_OUT_OF_MEMORY);
7624 }
7625}
7626
7627void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7628{
7629 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7630 index, x, y, z, w);
7631
7632 try
7633 {
7634 gl::Context *context = gl::getNonLostContext();
7635
7636 if (context)
7637 {
7638 if (context->getClientVersion() < 3)
7639 {
7640 return gl::error(GL_INVALID_OPERATION);
7641 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007642
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007643 if (index >= gl::MAX_VERTEX_ATTRIBS)
7644 {
7645 return gl::error(GL_INVALID_VALUE);
7646 }
7647
7648 GLuint vals[4] = { x, y, z, w };
7649 context->setVertexAttribu(index, vals);
7650 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007651 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007652 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007653 {
7654 return gl::error(GL_OUT_OF_MEMORY);
7655 }
7656}
7657
7658void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7659{
7660 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7661
7662 try
7663 {
7664 gl::Context *context = gl::getNonLostContext();
7665
7666 if (context)
7667 {
7668 if (context->getClientVersion() < 3)
7669 {
7670 return gl::error(GL_INVALID_OPERATION);
7671 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007672
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007673 if (index >= gl::MAX_VERTEX_ATTRIBS)
7674 {
7675 return gl::error(GL_INVALID_VALUE);
7676 }
7677
7678 context->setVertexAttribi(index, v);
7679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007680 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007681 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007682 {
7683 return gl::error(GL_OUT_OF_MEMORY);
7684 }
7685}
7686
7687void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7688{
7689 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7690
7691 try
7692 {
7693 gl::Context *context = gl::getNonLostContext();
7694
7695 if (context)
7696 {
7697 if (context->getClientVersion() < 3)
7698 {
7699 return gl::error(GL_INVALID_OPERATION);
7700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007701
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007702 if (index >= gl::MAX_VERTEX_ATTRIBS)
7703 {
7704 return gl::error(GL_INVALID_VALUE);
7705 }
7706
7707 context->setVertexAttribu(index, v);
7708 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007709 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007710 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007711 {
7712 return gl::error(GL_OUT_OF_MEMORY);
7713 }
7714}
7715
7716void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7717{
7718 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7719 program, location, params);
7720
7721 try
7722 {
7723 gl::Context *context = gl::getNonLostContext();
7724
7725 if (context)
7726 {
7727 if (context->getClientVersion() < 3)
7728 {
7729 return gl::error(GL_INVALID_OPERATION);
7730 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007731
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00007732 if (program == 0)
7733 {
7734 return gl::error(GL_INVALID_VALUE);
7735 }
7736
7737 gl::Program *programObject = context->getProgram(program);
7738
7739 if (!programObject || !programObject->isLinked())
7740 {
7741 return gl::error(GL_INVALID_OPERATION);
7742 }
7743
7744 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7745 if (!programBinary)
7746 {
7747 return gl::error(GL_INVALID_OPERATION);
7748 }
7749
7750 if (!programBinary->getUniformuiv(location, NULL, params))
7751 {
7752 return gl::error(GL_INVALID_OPERATION);
7753 }
7754 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007755 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007756 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007757 {
7758 return gl::error(GL_OUT_OF_MEMORY);
7759 }
7760}
7761
7762GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7763{
7764 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7765 program, name);
7766
7767 try
7768 {
7769 gl::Context *context = gl::getNonLostContext();
7770
7771 if (context)
7772 {
7773 if (context->getClientVersion() < 3)
7774 {
Jamie Madilld1e78c92013-06-20 11:55:50 -04007775 return gl::error(GL_INVALID_OPERATION, -1);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777
Jamie Madilld1e78c92013-06-20 11:55:50 -04007778 if (program == 0)
7779 {
7780 return gl::error(GL_INVALID_VALUE, -1);
7781 }
7782
7783 gl::Program *programObject = context->getProgram(program);
7784
7785 if (!programObject || !programObject->isLinked())
7786 {
7787 return gl::error(GL_INVALID_OPERATION, -1);
7788 }
7789
7790 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7791 if (!programBinary)
7792 {
7793 return gl::error(GL_INVALID_OPERATION, -1);
7794 }
7795
7796 return programBinary->getFragDataLocation(name);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007798 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007799 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007800 {
7801 return gl::error(GL_OUT_OF_MEMORY, 0);
7802 }
7803
7804 return 0;
7805}
7806
7807void __stdcall glUniform1ui(GLint location, GLuint v0)
7808{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007809 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007810}
7811
7812void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7813{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007814 const GLuint xy[] = { v0, v1 };
7815 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007816}
7817
7818void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7819{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007820 const GLuint xyz[] = { v0, v1, v2 };
7821 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822}
7823
7824void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7825{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00007826 const GLuint xyzw[] = { v0, v1, v2, v3 };
7827 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007828}
7829
7830void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7831{
7832 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7833 location, count, value);
7834
7835 try
7836 {
7837 gl::Context *context = gl::getNonLostContext();
7838
7839 if (context)
7840 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007841 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007842 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007843 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007844 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007845
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007846 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007847 programBinary->setUniform1uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007848 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007849 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007850 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007851 {
7852 return gl::error(GL_OUT_OF_MEMORY);
7853 }
7854}
7855
7856void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7857{
7858 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7859 location, count, value);
7860
7861 try
7862 {
7863 gl::Context *context = gl::getNonLostContext();
7864
7865 if (context)
7866 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007867 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007868 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007869 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007870 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007871
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007872 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007873 programBinary->setUniform2uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007875 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007876 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007877 {
7878 return gl::error(GL_OUT_OF_MEMORY);
7879 }
7880}
7881
7882void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7883{
7884 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7885 location, count, value);
7886
7887 try
7888 {
7889 gl::Context *context = gl::getNonLostContext();
7890
7891 if (context)
7892 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007893 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007894 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007895 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007896 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007897
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007898 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007899 programBinary->setUniform3uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007900 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007901 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007902 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007903 {
7904 return gl::error(GL_OUT_OF_MEMORY);
7905 }
7906}
7907
7908void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7909{
7910 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7911 location, count, value);
7912
7913 try
7914 {
7915 gl::Context *context = gl::getNonLostContext();
7916
7917 if (context)
7918 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007919 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007920 {
Jamie Madillaa981bd2014-05-20 10:55:55 -04007921 return;
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007923
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007924 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
Jamie Madill36398922014-05-20 14:51:53 -04007925 programBinary->setUniform4uiv(location, count, value);
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00007926 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007927 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007928 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007929 {
7930 return gl::error(GL_OUT_OF_MEMORY);
7931 }
7932}
7933
7934void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7935{
7936 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7937 buffer, drawbuffer, value);
7938
7939 try
7940 {
7941 gl::Context *context = gl::getNonLostContext();
7942
7943 if (context)
7944 {
7945 if (context->getClientVersion() < 3)
7946 {
7947 return gl::error(GL_INVALID_OPERATION);
7948 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007949
Geoff Lang42359ca2013-08-21 13:25:17 -04007950 switch (buffer)
7951 {
7952 case GL_COLOR:
7953 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7954 {
7955 return gl::error(GL_INVALID_VALUE);
7956 }
7957 break;
7958 case GL_STENCIL:
7959 if (drawbuffer != 0)
7960 {
7961 return gl::error(GL_INVALID_VALUE);
7962 }
Geoff Lang8d6a0022014-01-31 16:38:31 -05007963 break;
Geoff Lang42359ca2013-08-21 13:25:17 -04007964 default:
7965 return gl::error(GL_INVALID_ENUM);
7966 }
7967
7968 context->clearBufferiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00007969 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007970 }
Jamie Madillde0ec752014-05-05 15:10:38 -04007971 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007972 {
7973 return gl::error(GL_OUT_OF_MEMORY);
7974 }
7975}
7976
7977void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7978{
7979 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7980 buffer, drawbuffer, value);
7981
7982 try
7983 {
7984 gl::Context *context = gl::getNonLostContext();
7985
7986 if (context)
7987 {
7988 if (context->getClientVersion() < 3)
7989 {
7990 return gl::error(GL_INVALID_OPERATION);
7991 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007992
Geoff Lang42359ca2013-08-21 13:25:17 -04007993 switch (buffer)
7994 {
7995 case GL_COLOR:
7996 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7997 {
7998 return gl::error(GL_INVALID_VALUE);
7999 }
8000 break;
8001 default:
8002 return gl::error(GL_INVALID_ENUM);
8003 }
8004
8005 context->clearBufferuiv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008006 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008007 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008008 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008009 {
8010 return gl::error(GL_OUT_OF_MEMORY);
8011 }
8012}
8013
8014void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8015{
8016 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8017 buffer, drawbuffer, value);
8018
8019 try
8020 {
8021 gl::Context *context = gl::getNonLostContext();
8022
8023 if (context)
8024 {
8025 if (context->getClientVersion() < 3)
8026 {
8027 return gl::error(GL_INVALID_OPERATION);
8028 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008029
Geoff Lang42359ca2013-08-21 13:25:17 -04008030 switch (buffer)
8031 {
8032 case GL_COLOR:
8033 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8034 {
8035 return gl::error(GL_INVALID_VALUE);
8036 }
8037 break;
8038 case GL_DEPTH:
8039 if (drawbuffer != 0)
8040 {
8041 return gl::error(GL_INVALID_VALUE);
8042 }
8043 break;
8044 default:
8045 return gl::error(GL_INVALID_ENUM);
8046 }
8047
8048 context->clearBufferfv(buffer, drawbuffer, value);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008049 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008050 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008051 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008052 {
8053 return gl::error(GL_OUT_OF_MEMORY);
8054 }
8055}
8056
8057void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8058{
8059 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8060 buffer, drawbuffer, depth, stencil);
8061
8062 try
8063 {
8064 gl::Context *context = gl::getNonLostContext();
8065
8066 if (context)
8067 {
8068 if (context->getClientVersion() < 3)
8069 {
8070 return gl::error(GL_INVALID_OPERATION);
8071 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008072
Geoff Lang42359ca2013-08-21 13:25:17 -04008073 switch (buffer)
8074 {
8075 case GL_DEPTH_STENCIL:
8076 if (drawbuffer != 0)
8077 {
8078 return gl::error(GL_INVALID_VALUE);
8079 }
8080 break;
8081 default:
8082 return gl::error(GL_INVALID_ENUM);
8083 }
8084
8085 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008086 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008087 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008088 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008089 {
8090 return gl::error(GL_OUT_OF_MEMORY);
8091 }
8092}
8093
8094const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8095{
8096 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8097
8098 try
8099 {
8100 gl::Context *context = gl::getNonLostContext();
8101
8102 if (context)
8103 {
8104 if (context->getClientVersion() < 3)
8105 {
8106 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8107 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00008109 if (name != GL_EXTENSIONS)
8110 {
8111 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8112 }
8113
8114 if (index >= context->getNumExtensions())
8115 {
8116 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8117 }
8118
8119 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8120 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008121 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008122 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008123 {
8124 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8125 }
8126
8127 return NULL;
8128}
8129
8130void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8131{
8132 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8133 readTarget, writeTarget, readOffset, writeOffset, size);
8134
8135 try
8136 {
8137 gl::Context *context = gl::getNonLostContext();
8138
8139 if (context)
8140 {
8141 if (context->getClientVersion() < 3)
8142 {
8143 return gl::error(GL_INVALID_OPERATION);
8144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008145
Jamie Madill8c96d582014-03-05 15:01:23 -05008146 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008147 {
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008148 return gl::error(GL_INVALID_ENUM);
8149 }
8150
Jamie Madill8c96d582014-03-05 15:01:23 -05008151 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8152 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008153
8154 if (!readBuffer || !writeBuffer)
8155 {
8156 return gl::error(GL_INVALID_OPERATION);
8157 }
8158
Jamie Madill7a5f7382014-03-05 15:01:24 -05008159 if (readBuffer->mapped() || writeBuffer->mapped())
8160 {
8161 return gl::error(GL_INVALID_OPERATION);
8162 }
8163
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008164 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8165 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8166 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8167 {
8168 return gl::error(GL_INVALID_VALUE);
8169 }
8170
8171 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8172 {
8173 return gl::error(GL_INVALID_VALUE);
8174 }
8175
8176 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8177
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00008178 // if size is zero, the copy is a successful no-op
8179 if (size > 0)
8180 {
8181 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8182 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00008183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008185 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008186 {
8187 return gl::error(GL_OUT_OF_MEMORY);
8188 }
8189}
8190
8191void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8192{
8193 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8194 program, uniformCount, uniformNames, uniformIndices);
8195
8196 try
8197 {
8198 gl::Context *context = gl::getNonLostContext();
8199
8200 if (context)
8201 {
8202 if (context->getClientVersion() < 3)
8203 {
8204 return gl::error(GL_INVALID_OPERATION);
8205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008206
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00008207 if (uniformCount < 0)
8208 {
8209 return gl::error(GL_INVALID_VALUE);
8210 }
8211
8212 gl::Program *programObject = context->getProgram(program);
8213
8214 if (!programObject)
8215 {
8216 if (context->getShader(program))
8217 {
8218 return gl::error(GL_INVALID_OPERATION);
8219 }
8220 else
8221 {
8222 return gl::error(GL_INVALID_VALUE);
8223 }
8224 }
8225
8226 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8227 if (!programObject->isLinked() || !programBinary)
8228 {
8229 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8230 {
8231 uniformIndices[uniformId] = GL_INVALID_INDEX;
8232 }
8233 }
8234 else
8235 {
8236 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8237 {
8238 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8239 }
8240 }
8241 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008242 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008243 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008244 {
8245 return gl::error(GL_OUT_OF_MEMORY);
8246 }
8247}
8248
8249void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8250{
8251 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8252 program, uniformCount, uniformIndices, pname, params);
8253
8254 try
8255 {
8256 gl::Context *context = gl::getNonLostContext();
8257
8258 if (context)
8259 {
8260 if (context->getClientVersion() < 3)
8261 {
8262 return gl::error(GL_INVALID_OPERATION);
8263 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008264
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00008265 if (uniformCount < 0)
8266 {
8267 return gl::error(GL_INVALID_VALUE);
8268 }
8269
8270 gl::Program *programObject = context->getProgram(program);
8271
8272 if (!programObject)
8273 {
8274 if (context->getShader(program))
8275 {
8276 return gl::error(GL_INVALID_OPERATION);
8277 }
8278 else
8279 {
8280 return gl::error(GL_INVALID_VALUE);
8281 }
8282 }
8283
8284 switch (pname)
8285 {
8286 case GL_UNIFORM_TYPE:
8287 case GL_UNIFORM_SIZE:
8288 case GL_UNIFORM_NAME_LENGTH:
8289 case GL_UNIFORM_BLOCK_INDEX:
8290 case GL_UNIFORM_OFFSET:
8291 case GL_UNIFORM_ARRAY_STRIDE:
8292 case GL_UNIFORM_MATRIX_STRIDE:
8293 case GL_UNIFORM_IS_ROW_MAJOR:
8294 break;
8295 default:
8296 return gl::error(GL_INVALID_ENUM);
8297 }
8298
8299 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8300
8301 if (!programBinary && uniformCount > 0)
8302 {
8303 return gl::error(GL_INVALID_VALUE);
8304 }
8305
8306 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8307 {
8308 const GLuint index = uniformIndices[uniformId];
8309
8310 if (index >= (GLuint)programBinary->getActiveUniformCount())
8311 {
8312 return gl::error(GL_INVALID_VALUE);
8313 }
8314 }
8315
8316 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8317 {
8318 const GLuint index = uniformIndices[uniformId];
8319 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8320 }
8321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008322 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008323 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008324 {
8325 return gl::error(GL_OUT_OF_MEMORY);
8326 }
8327}
8328
8329GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8330{
8331 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8332
8333 try
8334 {
8335 gl::Context *context = gl::getNonLostContext();
8336
8337 if (context)
8338 {
8339 if (context->getClientVersion() < 3)
8340 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008341 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008342 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008343
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00008344 gl::Program *programObject = context->getProgram(program);
8345
8346 if (!programObject)
8347 {
8348 if (context->getShader(program))
8349 {
8350 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8351 }
8352 else
8353 {
8354 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8355 }
8356 }
8357
8358 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8359 if (!programBinary)
8360 {
8361 return GL_INVALID_INDEX;
8362 }
8363
8364 return programBinary->getUniformBlockIndex(uniformBlockName);
8365 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008366 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008367 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008368 {
8369 return gl::error(GL_OUT_OF_MEMORY, 0);
8370 }
8371
8372 return 0;
8373}
8374
8375void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8376{
8377 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8378 program, uniformBlockIndex, pname, params);
8379
8380 try
8381 {
8382 gl::Context *context = gl::getNonLostContext();
8383
8384 if (context)
8385 {
8386 if (context->getClientVersion() < 3)
8387 {
8388 return gl::error(GL_INVALID_OPERATION);
8389 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008390 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008391
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00008392 if (!programObject)
8393 {
8394 if (context->getShader(program))
8395 {
8396 return gl::error(GL_INVALID_OPERATION);
8397 }
8398 else
8399 {
8400 return gl::error(GL_INVALID_VALUE);
8401 }
8402 }
8403
8404 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8405
8406 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8407 {
8408 return gl::error(GL_INVALID_VALUE);
8409 }
8410
8411 switch (pname)
8412 {
8413 case GL_UNIFORM_BLOCK_BINDING:
8414 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8415 break;
8416
8417 case GL_UNIFORM_BLOCK_DATA_SIZE:
8418 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8419 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8420 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8421 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8422 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8423 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8424 break;
8425
8426 default:
8427 return gl::error(GL_INVALID_ENUM);
8428 }
8429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008430 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008431 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008432 {
8433 return gl::error(GL_OUT_OF_MEMORY);
8434 }
8435}
8436
8437void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8438{
8439 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8440 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8441
8442 try
8443 {
8444 gl::Context *context = gl::getNonLostContext();
8445
8446 if (context)
8447 {
8448 if (context->getClientVersion() < 3)
8449 {
8450 return gl::error(GL_INVALID_OPERATION);
8451 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008452
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00008453 gl::Program *programObject = context->getProgram(program);
8454
8455 if (!programObject)
8456 {
8457 if (context->getShader(program))
8458 {
8459 return gl::error(GL_INVALID_OPERATION);
8460 }
8461 else
8462 {
8463 return gl::error(GL_INVALID_VALUE);
8464 }
8465 }
8466
8467 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8468
8469 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8470 {
8471 return gl::error(GL_INVALID_VALUE);
8472 }
8473
8474 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8475 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008476 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008477 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008478 {
8479 return gl::error(GL_OUT_OF_MEMORY);
8480 }
8481}
8482
8483void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8484{
8485 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8486 program, uniformBlockIndex, uniformBlockBinding);
8487
8488 try
8489 {
8490 gl::Context *context = gl::getNonLostContext();
8491
8492 if (context)
8493 {
8494 if (context->getClientVersion() < 3)
8495 {
8496 return gl::error(GL_INVALID_OPERATION);
8497 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008498
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00008499 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8500 {
8501 return gl::error(GL_INVALID_VALUE);
8502 }
8503
8504 gl::Program *programObject = context->getProgram(program);
8505
8506 if (!programObject)
8507 {
8508 if (context->getShader(program))
8509 {
8510 return gl::error(GL_INVALID_OPERATION);
8511 }
8512 else
8513 {
8514 return gl::error(GL_INVALID_VALUE);
8515 }
8516 }
8517
8518 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8519
8520 // if never linked, there won't be any uniform blocks
8521 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8522 {
8523 return gl::error(GL_INVALID_VALUE);
8524 }
8525
8526 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8527 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008528 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008529 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008530 {
8531 return gl::error(GL_OUT_OF_MEMORY);
8532 }
8533}
8534
8535void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8536{
8537 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8538 mode, first, count, instanceCount);
8539
8540 try
8541 {
8542 gl::Context *context = gl::getNonLostContext();
8543
8544 if (context)
8545 {
8546 if (context->getClientVersion() < 3)
8547 {
8548 return gl::error(GL_INVALID_OPERATION);
8549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008550
Jamie Madill54133512013-06-21 09:33:07 -04008551 // glDrawArraysInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008552 UNIMPLEMENTED();
8553 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008554 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008555 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008556 {
8557 return gl::error(GL_OUT_OF_MEMORY);
8558 }
8559}
8560
8561void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8562{
8563 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8564 mode, count, type, indices, instanceCount);
8565
8566 try
8567 {
8568 gl::Context *context = gl::getNonLostContext();
8569
8570 if (context)
8571 {
8572 if (context->getClientVersion() < 3)
8573 {
8574 return gl::error(GL_INVALID_OPERATION);
8575 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008576
Jamie Madill54133512013-06-21 09:33:07 -04008577 // glDrawElementsInstanced
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008578 UNIMPLEMENTED();
8579 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008580 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008581 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008582 {
8583 return gl::error(GL_OUT_OF_MEMORY);
8584 }
8585}
8586
8587GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8588{
8589 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8590
8591 try
8592 {
8593 gl::Context *context = gl::getNonLostContext();
8594
8595 if (context)
8596 {
8597 if (context->getClientVersion() < 3)
8598 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008599 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008601
Jamie Madill5215e1a2013-07-26 11:55:19 -04008602 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8603 {
8604 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8605 }
8606
8607 if (flags != 0)
8608 {
8609 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8610 }
8611
8612 return context->createFenceSync(condition);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008614 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008615 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008616 {
8617 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8618 }
8619
8620 return NULL;
8621}
8622
8623GLboolean __stdcall glIsSync(GLsync sync)
8624{
8625 EVENT("(GLsync sync = 0x%0.8p)", sync);
8626
8627 try
8628 {
8629 gl::Context *context = gl::getNonLostContext();
8630
8631 if (context)
8632 {
8633 if (context->getClientVersion() < 3)
8634 {
8635 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8636 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008637
Jamie Madill5215e1a2013-07-26 11:55:19 -04008638 return (context->getFenceSync(sync) != NULL);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008639 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008640 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008641 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008642 {
8643 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8644 }
8645
8646 return GL_FALSE;
8647}
8648
8649void __stdcall glDeleteSync(GLsync sync)
8650{
8651 EVENT("(GLsync sync = 0x%0.8p)", sync);
8652
8653 try
8654 {
8655 gl::Context *context = gl::getNonLostContext();
8656
8657 if (context)
8658 {
8659 if (context->getClientVersion() < 3)
8660 {
8661 return gl::error(GL_INVALID_OPERATION);
8662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008663
Jamie Madill5215e1a2013-07-26 11:55:19 -04008664 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8665 {
8666 return gl::error(GL_INVALID_VALUE);
8667 }
8668
8669 context->deleteFenceSync(sync);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008670 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008671 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008672 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008673 {
8674 return gl::error(GL_OUT_OF_MEMORY);
8675 }
8676}
8677
8678GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8679{
8680 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8681 sync, flags, timeout);
8682
8683 try
8684 {
8685 gl::Context *context = gl::getNonLostContext();
8686
8687 if (context)
8688 {
8689 if (context->getClientVersion() < 3)
8690 {
Jamie Madill5215e1a2013-07-26 11:55:19 -04008691 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008693
Jamie Madill5215e1a2013-07-26 11:55:19 -04008694 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8695 {
8696 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8697 }
8698
8699 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8700
8701 if (!fenceSync)
8702 {
8703 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8704 }
8705
8706 return fenceSync->clientWait(flags, timeout);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008707 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008708 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008709 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008710 {
8711 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8712 }
8713
8714 return GL_FALSE;
8715}
8716
8717void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8718{
8719 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8720 sync, flags, timeout);
8721
8722 try
8723 {
8724 gl::Context *context = gl::getNonLostContext();
8725
8726 if (context)
8727 {
8728 if (context->getClientVersion() < 3)
8729 {
8730 return gl::error(GL_INVALID_OPERATION);
8731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008732
Jamie Madill5215e1a2013-07-26 11:55:19 -04008733 if (flags != 0)
8734 {
8735 return gl::error(GL_INVALID_VALUE);
8736 }
8737
8738 if (timeout != GL_TIMEOUT_IGNORED)
8739 {
8740 return gl::error(GL_INVALID_VALUE);
8741 }
8742
8743 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8744
8745 if (!fenceSync)
8746 {
8747 return gl::error(GL_INVALID_VALUE);
8748 }
8749
8750 fenceSync->serverWait();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008751 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008752 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008753 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008754 {
8755 return gl::error(GL_OUT_OF_MEMORY);
8756 }
8757}
8758
8759void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8760{
8761 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8762 pname, params);
8763
8764 try
8765 {
8766 gl::Context *context = gl::getNonLostContext();
8767
8768 if (context)
8769 {
8770 if (context->getClientVersion() < 3)
8771 {
8772 return gl::error(GL_INVALID_OPERATION);
8773 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008774
Jamie Madill79f2f452013-12-19 11:13:02 -05008775 GLenum nativeType;
8776 unsigned int numParams = 0;
Jamie Madill893ab082014-05-16 16:56:10 -04008777 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8778 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008779 return;
Jamie Madill893ab082014-05-16 16:56:10 -04008780 }
Jamie Madill79f2f452013-12-19 11:13:02 -05008781
8782 if (nativeType == GL_INT_64_ANGLEX)
Jamie Madill71fbd602013-07-19 16:36:55 -04008783 {
Jamie Madill79f2f452013-12-19 11:13:02 -05008784 context->getInteger64v(pname, params);
8785 }
Jamie Madill55856b12014-01-02 13:59:50 -05008786 else
Jamie Madill79f2f452013-12-19 11:13:02 -05008787 {
Jamie Madill55856b12014-01-02 13:59:50 -05008788 CastStateValues(context, nativeType, pname, numParams, params);
Jamie Madill71fbd602013-07-19 16:36:55 -04008789 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008790 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008791 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008792 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008793 {
8794 return gl::error(GL_OUT_OF_MEMORY);
8795 }
8796}
8797
8798void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8799{
8800 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8801 sync, pname, bufSize, length, values);
8802
8803 try
8804 {
8805 gl::Context *context = gl::getNonLostContext();
8806
8807 if (context)
8808 {
8809 if (context->getClientVersion() < 3)
8810 {
8811 return gl::error(GL_INVALID_OPERATION);
8812 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008813
Jamie Madill5215e1a2013-07-26 11:55:19 -04008814 if (bufSize < 0)
8815 {
8816 return gl::error(GL_INVALID_VALUE);
8817 }
8818
8819 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8820
8821 if (!fenceSync)
8822 {
8823 return gl::error(GL_INVALID_VALUE);
8824 }
8825
8826 switch (pname)
8827 {
8828 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8829 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8830 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8831 case GL_SYNC_FLAGS: values[0] = 0; break;
8832
8833 default:
8834 return gl::error(GL_INVALID_ENUM);
8835 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008836 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008837 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008838 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008839 {
8840 return gl::error(GL_OUT_OF_MEMORY);
8841 }
8842}
8843
8844void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8845{
8846 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8847 target, index, data);
8848
8849 try
8850 {
8851 gl::Context *context = gl::getNonLostContext();
8852
8853 if (context)
8854 {
8855 if (context->getClientVersion() < 3)
8856 {
8857 return gl::error(GL_INVALID_OPERATION);
8858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859
Shannon Woods15934d52013-08-19 14:28:49 -04008860 switch (target)
8861 {
8862 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8863 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8864 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8865 if (index >= context->getMaxTransformFeedbackBufferBindings())
8866 return gl::error(GL_INVALID_VALUE);
8867 break;
8868 case GL_UNIFORM_BUFFER_START:
8869 case GL_UNIFORM_BUFFER_SIZE:
8870 case GL_UNIFORM_BUFFER_BINDING:
8871 if (index >= context->getMaximumCombinedUniformBufferBindings())
8872 return gl::error(GL_INVALID_VALUE);
8873 break;
8874 default:
8875 return gl::error(GL_INVALID_ENUM);
8876 }
8877
8878 if (!(context->getIndexedInteger64v(target, index, data)))
8879 {
8880 GLenum nativeType;
8881 unsigned int numParams = 0;
8882 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8883 return gl::error(GL_INVALID_ENUM);
8884
8885 if (numParams == 0)
8886 return; // it is known that pname is valid, but there are no parameters to return
8887
8888 if (nativeType == GL_INT)
8889 {
8890 GLint *intParams = new GLint[numParams];
8891
8892 context->getIndexedIntegerv(target, index, intParams);
8893
8894 for (unsigned int i = 0; i < numParams; ++i)
8895 {
8896 data[i] = static_cast<GLint64>(intParams[i]);
8897 }
8898
8899 delete [] intParams;
8900 }
8901 else
8902 {
8903 UNREACHABLE();
8904 }
8905 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008906 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008907 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008908 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008909 {
8910 return gl::error(GL_OUT_OF_MEMORY);
8911 }
8912}
8913
8914void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8915{
8916 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8917 target, pname, params);
8918
8919 try
8920 {
8921 gl::Context *context = gl::getNonLostContext();
8922
8923 if (context)
8924 {
8925 if (context->getClientVersion() < 3)
8926 {
8927 return gl::error(GL_INVALID_OPERATION);
8928 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008929
Jamie Madill70656a62014-03-05 15:01:26 -05008930 if (!gl::ValidBufferTarget(context, target))
8931 {
8932 return gl::error(GL_INVALID_ENUM);
8933 }
8934
8935 if (!gl::ValidBufferParameter(context, pname))
8936 {
8937 return gl::error(GL_INVALID_ENUM);
8938 }
8939
8940 gl::Buffer *buffer = context->getTargetBuffer(target);
8941
8942 if (!buffer)
8943 {
8944 // A null buffer means that "0" is bound to the requested buffer target
8945 return gl::error(GL_INVALID_OPERATION);
8946 }
8947
8948 switch (pname)
8949 {
8950 case GL_BUFFER_USAGE:
8951 *params = static_cast<GLint64>(buffer->usage());
8952 break;
8953 case GL_BUFFER_SIZE:
8954 *params = buffer->size();
8955 break;
8956 case GL_BUFFER_ACCESS_FLAGS:
8957 *params = static_cast<GLint64>(buffer->accessFlags());
8958 break;
8959 case GL_BUFFER_MAPPED:
8960 *params = static_cast<GLint64>(buffer->mapped());
8961 break;
8962 case GL_BUFFER_MAP_OFFSET:
8963 *params = buffer->mapOffset();
8964 break;
8965 case GL_BUFFER_MAP_LENGTH:
8966 *params = buffer->mapLength();
8967 break;
8968 default: UNREACHABLE(); break;
8969 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00008970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008971 }
Jamie Madillde0ec752014-05-05 15:10:38 -04008972 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008973 {
8974 return gl::error(GL_OUT_OF_MEMORY);
8975 }
8976}
8977
8978void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8979{
8980 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8981
8982 try
8983 {
8984 gl::Context *context = gl::getNonLostContext();
8985
8986 if (context)
8987 {
8988 if (context->getClientVersion() < 3)
8989 {
8990 return gl::error(GL_INVALID_OPERATION);
8991 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008992
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04008993 if (count < 0)
8994 {
8995 return gl::error(GL_INVALID_VALUE);
8996 }
8997
8998 for (int i = 0; i < count; i++)
8999 {
9000 samplers[i] = context->createSampler();
9001 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009002 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009003 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009004 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009005 {
9006 return gl::error(GL_OUT_OF_MEMORY);
9007 }
9008}
9009
9010void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9011{
9012 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9013
9014 try
9015 {
9016 gl::Context *context = gl::getNonLostContext();
9017
9018 if (context)
9019 {
9020 if (context->getClientVersion() < 3)
9021 {
9022 return gl::error(GL_INVALID_OPERATION);
9023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009024
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009025 if (count < 0)
9026 {
9027 return gl::error(GL_INVALID_VALUE);
9028 }
9029
9030 for (int i = 0; i < count; i++)
9031 {
9032 context->deleteSampler(samplers[i]);
9033 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009034 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009035 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009036 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009037 {
9038 return gl::error(GL_OUT_OF_MEMORY);
9039 }
9040}
9041
9042GLboolean __stdcall glIsSampler(GLuint sampler)
9043{
9044 EVENT("(GLuint sampler = %u)", sampler);
9045
9046 try
9047 {
9048 gl::Context *context = gl::getNonLostContext();
9049
9050 if (context)
9051 {
9052 if (context->getClientVersion() < 3)
9053 {
9054 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9055 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009056
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009057 return context->isSampler(sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009059 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009060 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009061 {
9062 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9063 }
9064
9065 return GL_FALSE;
9066}
9067
9068void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9069{
9070 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009083 if (sampler != 0 && !context->isSampler(sampler))
9084 {
9085 return gl::error(GL_INVALID_OPERATION);
9086 }
9087
9088 if (unit >= context->getMaximumCombinedTextureImageUnits())
9089 {
9090 return gl::error(GL_INVALID_VALUE);
9091 }
9092
9093 context->bindSampler(unit, sampler);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009095 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009096 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009097 {
9098 return gl::error(GL_OUT_OF_MEMORY);
9099 }
9100}
9101
9102void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9103{
9104 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9105
9106 try
9107 {
9108 gl::Context *context = gl::getNonLostContext();
9109
9110 if (context)
9111 {
9112 if (context->getClientVersion() < 3)
9113 {
9114 return gl::error(GL_INVALID_OPERATION);
9115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009116
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009117 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009118 {
9119 return;
9120 }
9121
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009122 if (!gl::ValidateTexParamParameters(context, pname, param))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009123 {
9124 return;
9125 }
9126
9127 if (!context->isSampler(sampler))
9128 {
9129 return gl::error(GL_INVALID_OPERATION);
9130 }
9131
9132 context->samplerParameteri(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009134 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009135 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009136 {
9137 return gl::error(GL_OUT_OF_MEMORY);
9138 }
9139}
9140
9141void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9142{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009143 glSamplerParameteri(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009144}
9145
9146void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9147{
9148 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9149
9150 try
9151 {
9152 gl::Context *context = gl::getNonLostContext();
9153
9154 if (context)
9155 {
9156 if (context->getClientVersion() < 3)
9157 {
9158 return gl::error(GL_INVALID_OPERATION);
9159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009160
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009161 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009162 {
9163 return;
9164 }
9165
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009166 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009167 {
9168 return;
9169 }
9170
9171 if (!context->isSampler(sampler))
9172 {
9173 return gl::error(GL_INVALID_OPERATION);
9174 }
9175
9176 context->samplerParameterf(sampler, pname, param);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009177 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009178 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009179 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009180 {
9181 return gl::error(GL_OUT_OF_MEMORY);
9182 }
9183}
9184
9185void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9186{
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009187 glSamplerParameterf(sampler, pname, *param);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009188}
9189
9190void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9191{
9192 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9193
9194 try
9195 {
9196 gl::Context *context = gl::getNonLostContext();
9197
9198 if (context)
9199 {
9200 if (context->getClientVersion() < 3)
9201 {
9202 return gl::error(GL_INVALID_OPERATION);
9203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009204
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009205 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009206 {
9207 return;
9208 }
9209
9210 if (!context->isSampler(sampler))
9211 {
9212 return gl::error(GL_INVALID_OPERATION);
9213 }
9214
9215 *params = context->getSamplerParameteri(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009216 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009217 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009218 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009219 {
9220 return gl::error(GL_OUT_OF_MEMORY);
9221 }
9222}
9223
9224void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9225{
9226 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9227
9228 try
9229 {
9230 gl::Context *context = gl::getNonLostContext();
9231
9232 if (context)
9233 {
9234 if (context->getClientVersion() < 3)
9235 {
9236 return gl::error(GL_INVALID_OPERATION);
9237 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009238
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009239 if (!gl::ValidateSamplerObjectParameter(pname))
Jamie Madillf6cc8cc2013-07-03 12:44:15 -04009240 {
9241 return;
9242 }
9243
9244 if (!context->isSampler(sampler))
9245 {
9246 return gl::error(GL_INVALID_OPERATION);
9247 }
9248
9249 *params = context->getSamplerParameterf(sampler, pname);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009250 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009251 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009252 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009253 {
9254 return gl::error(GL_OUT_OF_MEMORY);
9255 }
9256}
9257
9258void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9259{
9260 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9261
9262 try
9263 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009264 if (index >= gl::MAX_VERTEX_ATTRIBS)
9265 {
9266 return gl::error(GL_INVALID_VALUE);
9267 }
9268
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009269 gl::Context *context = gl::getNonLostContext();
9270
9271 if (context)
9272 {
9273 if (context->getClientVersion() < 3)
9274 {
9275 return gl::error(GL_INVALID_OPERATION);
9276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009277
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +00009278 context->setVertexAttribDivisor(index, divisor);
9279 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009280 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009281 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009282 {
9283 return gl::error(GL_OUT_OF_MEMORY);
9284 }
9285}
9286
9287void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9288{
9289 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9290
9291 try
9292 {
9293 gl::Context *context = gl::getNonLostContext();
9294
9295 if (context)
9296 {
9297 if (context->getClientVersion() < 3)
9298 {
9299 return gl::error(GL_INVALID_OPERATION);
9300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009301
Geoff Langc8058452014-02-03 12:04:11 -05009302 switch (target)
9303 {
9304 case GL_TRANSFORM_FEEDBACK:
9305 {
9306 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9307 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9308 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9309 {
9310 return gl::error(GL_INVALID_OPERATION);
9311 }
9312
9313 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9314 if (context->getTransformFeedback(id) == NULL)
9315 {
9316 return gl::error(GL_INVALID_OPERATION);
9317 }
9318
9319 context->bindTransformFeedback(id);
9320 }
9321 break;
9322
9323 default:
9324 return gl::error(GL_INVALID_ENUM);
9325 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009326 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009327 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009328 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009329 {
9330 return gl::error(GL_OUT_OF_MEMORY);
9331 }
9332}
9333
9334void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9335{
9336 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9337
9338 try
9339 {
9340 gl::Context *context = gl::getNonLostContext();
9341
9342 if (context)
9343 {
9344 if (context->getClientVersion() < 3)
9345 {
9346 return gl::error(GL_INVALID_OPERATION);
9347 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009348
Geoff Langc8058452014-02-03 12:04:11 -05009349 for (int i = 0; i < n; i++)
9350 {
9351 context->deleteTransformFeedback(ids[i]);
9352 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009353 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009354 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009355 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009356 {
9357 return gl::error(GL_OUT_OF_MEMORY);
9358 }
9359}
9360
9361void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9362{
9363 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9364
9365 try
9366 {
9367 gl::Context *context = gl::getNonLostContext();
9368
9369 if (context)
9370 {
9371 if (context->getClientVersion() < 3)
9372 {
9373 return gl::error(GL_INVALID_OPERATION);
9374 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009375
Geoff Langc8058452014-02-03 12:04:11 -05009376 for (int i = 0; i < n; i++)
9377 {
9378 ids[i] = context->createTransformFeedback();
9379 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009381 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009382 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009383 {
9384 return gl::error(GL_OUT_OF_MEMORY);
9385 }
9386}
9387
9388GLboolean __stdcall glIsTransformFeedback(GLuint id)
9389{
9390 EVENT("(GLuint id = %u)", id);
9391
9392 try
9393 {
9394 gl::Context *context = gl::getNonLostContext();
9395
9396 if (context)
9397 {
9398 if (context->getClientVersion() < 3)
9399 {
9400 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009402
Geoff Langc8058452014-02-03 12:04:11 -05009403 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009404 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009405 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009406 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009407 {
9408 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9409 }
9410
9411 return GL_FALSE;
9412}
9413
9414void __stdcall glPauseTransformFeedback(void)
9415{
9416 EVENT("(void)");
9417
9418 try
9419 {
9420 gl::Context *context = gl::getNonLostContext();
9421
9422 if (context)
9423 {
9424 if (context->getClientVersion() < 3)
9425 {
9426 return gl::error(GL_INVALID_OPERATION);
9427 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009428
Geoff Langc8058452014-02-03 12:04:11 -05009429 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9430 ASSERT(transformFeedback != NULL);
9431
9432 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9433 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9434 {
9435 return gl::error(GL_INVALID_OPERATION);
9436 }
9437
9438 transformFeedback->pause();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009439 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009440 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009441 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009442 {
9443 return gl::error(GL_OUT_OF_MEMORY);
9444 }
9445}
9446
9447void __stdcall glResumeTransformFeedback(void)
9448{
9449 EVENT("(void)");
9450
9451 try
9452 {
9453 gl::Context *context = gl::getNonLostContext();
9454
9455 if (context)
9456 {
9457 if (context->getClientVersion() < 3)
9458 {
9459 return gl::error(GL_INVALID_OPERATION);
9460 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009461
Geoff Langc8058452014-02-03 12:04:11 -05009462 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9463 ASSERT(transformFeedback != NULL);
9464
9465 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9466 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9467 {
9468 return gl::error(GL_INVALID_OPERATION);
9469 }
9470
9471 transformFeedback->resume();
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009472 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009473 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009474 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009475 {
9476 return gl::error(GL_OUT_OF_MEMORY);
9477 }
9478}
9479
9480void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9481{
9482 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9483 program, bufSize, length, binaryFormat, binary);
9484
9485 try
9486 {
9487 gl::Context *context = gl::getNonLostContext();
9488
9489 if (context)
9490 {
9491 if (context->getClientVersion() < 3)
9492 {
9493 return gl::error(GL_INVALID_OPERATION);
9494 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009495
Jamie Madill54133512013-06-21 09:33:07 -04009496 // glGetProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009497 UNIMPLEMENTED();
9498 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009499 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009500 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009501 {
9502 return gl::error(GL_OUT_OF_MEMORY);
9503 }
9504}
9505
9506void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9507{
9508 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9509 program, binaryFormat, binary, length);
9510
9511 try
9512 {
9513 gl::Context *context = gl::getNonLostContext();
9514
9515 if (context)
9516 {
9517 if (context->getClientVersion() < 3)
9518 {
9519 return gl::error(GL_INVALID_OPERATION);
9520 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009521
Jamie Madill54133512013-06-21 09:33:07 -04009522 // glProgramBinary
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009523 UNIMPLEMENTED();
9524 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009525 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009526 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009527 {
9528 return gl::error(GL_OUT_OF_MEMORY);
9529 }
9530}
9531
9532void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9533{
9534 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9535 program, pname, value);
9536
9537 try
9538 {
9539 gl::Context *context = gl::getNonLostContext();
9540
9541 if (context)
9542 {
9543 if (context->getClientVersion() < 3)
9544 {
9545 return gl::error(GL_INVALID_OPERATION);
9546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009547
Jamie Madill54133512013-06-21 09:33:07 -04009548 // glProgramParameteri
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009549 UNIMPLEMENTED();
9550 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009551 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009552 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009553 {
9554 return gl::error(GL_OUT_OF_MEMORY);
9555 }
9556}
9557
9558void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9559{
9560 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9561 target, numAttachments, attachments);
9562
9563 try
9564 {
9565 gl::Context *context = gl::getNonLostContext();
9566
9567 if (context)
9568 {
9569 if (context->getClientVersion() < 3)
9570 {
9571 return gl::error(GL_INVALID_OPERATION);
9572 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009573
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009574 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009575 {
9576 return;
9577 }
9578
9579 int maxDimension = context->getMaximumRenderbufferDimension();
9580 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9581 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009582 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009583 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009584 {
9585 return gl::error(GL_OUT_OF_MEMORY);
9586 }
9587}
9588
9589void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9590{
9591 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9592 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9593 target, numAttachments, attachments, x, y, width, height);
9594
9595 try
9596 {
9597 gl::Context *context = gl::getNonLostContext();
9598
9599 if (context)
9600 {
9601 if (context->getClientVersion() < 3)
9602 {
9603 return gl::error(GL_INVALID_OPERATION);
9604 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009605
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009606 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00009607 {
9608 return;
9609 }
9610
9611 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9612 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009613 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009614 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009615 {
9616 return gl::error(GL_OUT_OF_MEMORY);
9617 }
9618}
9619
9620void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9621{
9622 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9623 target, levels, internalformat, width, height);
9624
9625 try
9626 {
9627 gl::Context *context = gl::getNonLostContext();
9628
9629 if (context)
9630 {
9631 if (context->getClientVersion() < 3)
9632 {
9633 return gl::error(GL_INVALID_OPERATION);
9634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009635
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009636 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009637 {
9638 return;
9639 }
9640
9641 switch (target)
9642 {
9643 case GL_TEXTURE_2D:
9644 {
9645 gl::Texture2D *texture2d = context->getTexture2D();
9646 texture2d->storage(levels, internalformat, width, height);
9647 }
9648 break;
9649
Geoff Lang01c21d22013-09-24 11:52:16 -04009650 case GL_TEXTURE_CUBE_MAP:
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009651 {
9652 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9653 textureCube->storage(levels, internalformat, width);
9654 }
9655 break;
9656
9657 default:
9658 return gl::error(GL_INVALID_ENUM);
9659 }
9660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009661 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009662 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009663 {
9664 return gl::error(GL_OUT_OF_MEMORY);
9665 }
9666}
9667
9668void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9669{
9670 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9671 "GLsizei height = %d, GLsizei depth = %d)",
9672 target, levels, internalformat, width, height, depth);
9673
9674 try
9675 {
9676 gl::Context *context = gl::getNonLostContext();
9677
9678 if (context)
9679 {
9680 if (context->getClientVersion() < 3)
9681 {
9682 return gl::error(GL_INVALID_OPERATION);
9683 }
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009684
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009685 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009686 {
9687 return;
9688 }
9689
9690 switch (target)
9691 {
9692 case GL_TEXTURE_3D:
9693 {
9694 gl::Texture3D *texture3d = context->getTexture3D();
9695 texture3d->storage(levels, internalformat, width, height, depth);
9696 }
9697 break;
9698
9699 case GL_TEXTURE_2D_ARRAY:
9700 {
9701 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9702 texture2darray->storage(levels, internalformat, width, height, depth);
9703 }
9704 break;
9705
9706 default:
Geoff Lang01c21d22013-09-24 11:52:16 -04009707 UNREACHABLE();
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +00009708 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00009709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009710 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009711 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009712 {
9713 return gl::error(GL_OUT_OF_MEMORY);
9714 }
9715}
9716
9717void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9718{
9719 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9720 "GLint* params = 0x%0.8p)",
9721 target, internalformat, pname, bufSize, params);
9722
9723 try
9724 {
9725 gl::Context *context = gl::getNonLostContext();
9726
9727 if (context)
9728 {
9729 if (context->getClientVersion() < 3)
9730 {
9731 return gl::error(GL_INVALID_OPERATION);
9732 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009733
Shannon Woods809d2502013-07-08 10:32:18 -04009734 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9735 !gl::IsDepthRenderingSupported(internalformat, context) &&
9736 !gl::IsStencilRenderingSupported(internalformat, context))
9737 {
9738 return gl::error(GL_INVALID_ENUM);
9739 }
9740
9741 if (target != GL_RENDERBUFFER)
9742 {
9743 return gl::error(GL_INVALID_ENUM);
9744 }
9745
9746 if (bufSize < 0)
9747 {
9748 return gl::error(GL_INVALID_VALUE);
9749 }
9750
9751 switch (pname)
9752 {
9753 case GL_NUM_SAMPLE_COUNTS:
9754 if (bufSize != 0)
9755 *params = context->getNumSampleCounts(internalformat);
9756 break;
9757 case GL_SAMPLES:
9758 context->getSampleCounts(internalformat, bufSize, params);
9759 break;
9760 default:
9761 return gl::error(GL_INVALID_ENUM);
9762 }
shannonwoods@chromium.org705fc2f2013-05-30 00:17:14 +00009763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009764 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009765 catch (...)
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009766 {
9767 return gl::error(GL_OUT_OF_MEMORY);
9768 }
9769}
9770
9771// Extension functions
9772
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009773void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9774 GLbitfield mask, GLenum filter)
9775{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009776 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009777 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9778 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9779 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9780
9781 try
9782 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00009783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009784
9785 if (context)
9786 {
Geoff Lang34dbb6f2013-08-05 15:05:47 -04009787 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
Geoff Lang758d5b22013-06-11 11:42:50 -04009788 dstX0, dstY0, dstX1, dstY1, mask, filter,
9789 true))
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009790 {
Geoff Lang758d5b22013-06-11 11:42:50 -04009791 return;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009792 }
9793
Geoff Lang758d5b22013-06-11 11:42:50 -04009794 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9795 mask, filter);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009796 }
9797 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009798 catch (...)
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00009801 }
9802}
9803
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009804void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9805 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00009807 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00009808 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00009809 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009810 target, level, internalformat, width, height, depth, border, format, type, pixels);
9811
9812 try
9813 {
9814 UNIMPLEMENTED(); // FIXME
9815 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009816 catch (...)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009819 }
9820}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00009821
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009822void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9823 GLenum *binaryFormat, void *binary)
9824{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009825 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 +00009826 program, bufSize, length, binaryFormat, binary);
9827
9828 try
9829 {
9830 gl::Context *context = gl::getNonLostContext();
9831
9832 if (context)
9833 {
9834 gl::Program *programObject = context->getProgram(program);
9835
daniel@transgaming.com716056c2012-07-24 18:38:59 +00009836 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009838 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009839 }
9840
9841 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9842
9843 if (!programBinary)
9844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009845 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009846 }
9847
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009848 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009850 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009851 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00009852
9853 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009854 }
9855 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009856 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009858 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009859 }
9860}
9861
9862void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9863 const void *binary, GLint length)
9864{
9865 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9866 program, binaryFormat, binary, length);
9867
9868 try
9869 {
9870 gl::Context *context = gl::getNonLostContext();
9871
9872 if (context)
9873 {
9874 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009876 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009877 }
9878
9879 gl::Program *programObject = context->getProgram(program);
9880
9881 if (!programObject)
9882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009883 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009884 }
9885
daniel@transgaming.com95d29422012-07-24 18:36:10 +00009886 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009887 }
9888 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009889 catch (...)
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00009891 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00009892 }
9893}
9894
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009895void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9896{
9897 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9898
9899 try
9900 {
9901 gl::Context *context = gl::getNonLostContext();
9902
9903 if (context)
9904 {
9905 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9906 {
9907 return gl::error(GL_INVALID_VALUE);
9908 }
9909
9910 if (context->getDrawFramebufferHandle() == 0)
9911 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009912 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009913 {
9914 return gl::error(GL_INVALID_OPERATION);
9915 }
9916
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009917 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009918 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009919 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009920 }
9921 }
9922 else
9923 {
9924 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9925 {
9926 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9927 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9928 {
9929 return gl::error(GL_INVALID_OPERATION);
9930 }
9931 }
9932 }
9933
9934 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9935
9936 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9937 {
9938 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9939 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +00009940
9941 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9942 {
9943 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9944 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009945 }
9946 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009947 catch (...)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +00009948 {
9949 return gl::error(GL_OUT_OF_MEMORY);
9950 }
9951}
9952
Shannon Woodsb3801742014-03-27 14:59:19 -04009953void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9954{
9955 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9956
9957 try
9958 {
9959 gl::Context *context = gl::getNonLostContext();
9960
9961 if (context)
9962 {
9963 if (!context->supportsPBOs())
9964 {
9965 return gl::error(GL_INVALID_OPERATION);
9966 }
9967
9968 if (!gl::ValidBufferTarget(context, target))
9969 {
9970 return gl::error(GL_INVALID_ENUM);
9971 }
9972
9973 if (pname != GL_BUFFER_MAP_POINTER)
9974 {
9975 return gl::error(GL_INVALID_ENUM);
9976 }
9977
9978 gl::Buffer *buffer = context->getTargetBuffer(target);
9979
9980 if (!buffer || !buffer->mapped())
9981 {
9982 *params = NULL;
9983 }
9984
9985 *params = buffer->mapPointer();
9986 }
9987 }
Jamie Madillde0ec752014-05-05 15:10:38 -04009988 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -04009989 {
9990 return gl::error(GL_OUT_OF_MEMORY);
9991 }
9992}
9993
9994void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9995{
9996 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9997
9998 try
9999 {
10000 gl::Context *context = gl::getNonLostContext();
10001
10002 if (context)
10003 {
10004 if (!gl::ValidBufferTarget(context, target))
10005 {
10006 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10007 }
10008
10009 gl::Buffer *buffer = context->getTargetBuffer(target);
10010
10011 if (buffer == NULL)
10012 {
10013 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10014 }
10015
10016 if (access != GL_WRITE_ONLY_OES)
10017 {
10018 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10019 }
10020
10021 if (buffer->mapped())
10022 {
10023 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10024 }
10025
10026 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10027 }
10028 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010029 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010030 {
10031 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10032 }
10033
10034 return NULL;
10035}
10036
10037GLboolean __stdcall glUnmapBufferOES(GLenum target)
10038{
10039 EVENT("(GLenum target = 0x%X)", target);
10040
10041 try
10042 {
10043 gl::Context *context = gl::getNonLostContext();
10044
10045 if (context)
10046 {
10047 if (!gl::ValidBufferTarget(context, target))
10048 {
10049 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10050 }
10051
10052 gl::Buffer *buffer = context->getTargetBuffer(target);
10053
10054 if (buffer == NULL || !buffer->mapped())
10055 {
10056 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10057 }
10058
10059 // TODO: detect if we had corruption. if so, throw an error and return false.
10060
10061 buffer->unmap();
10062
10063 return GL_TRUE;
10064 }
10065 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010066 catch (...)
Shannon Woodsb3801742014-03-27 14:59:19 -040010067 {
10068 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10069 }
10070
10071 return GL_FALSE;
10072}
10073
Shannon Woods916e7692014-03-27 16:58:22 -040010074void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10075{
10076 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10077 target, offset, length, access);
10078
10079 try
10080 {
10081 gl::Context *context = gl::getNonLostContext();
10082
10083 if (context)
10084 {
10085 if (!gl::ValidBufferTarget(context, target))
10086 {
10087 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10088 }
10089
10090 if (offset < 0 || length < 0)
10091 {
10092 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10093 }
10094
10095 gl::Buffer *buffer = context->getTargetBuffer(target);
10096
10097 if (buffer == NULL)
10098 {
10099 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10100 }
10101
10102 // Check for buffer overflow
10103 size_t offsetSize = static_cast<size_t>(offset);
10104 size_t lengthSize = static_cast<size_t>(length);
10105
10106 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10107 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10108 {
10109 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10110 }
10111
10112 // Check for invalid bits in the mask
10113 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10114 GL_MAP_WRITE_BIT |
10115 GL_MAP_INVALIDATE_RANGE_BIT |
10116 GL_MAP_INVALIDATE_BUFFER_BIT |
10117 GL_MAP_FLUSH_EXPLICIT_BIT |
10118 GL_MAP_UNSYNCHRONIZED_BIT;
10119
10120 if (access & ~(allAccessBits))
10121 {
10122 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10123 }
10124
10125 if (length == 0 || buffer->mapped())
10126 {
10127 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10128 }
10129
10130 // Check for invalid bit combinations
10131 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10132 {
10133 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10134 }
10135
10136 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10137 GL_MAP_INVALIDATE_BUFFER_BIT |
10138 GL_MAP_UNSYNCHRONIZED_BIT;
10139
10140 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10141 {
10142 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10143 }
10144
10145 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10146 {
10147 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10148 }
10149
10150 return buffer->mapRange(offset, length, access);
10151 }
10152 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010153 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010154 {
10155 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10156 }
10157
10158 return NULL;
10159}
10160
10161void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10162{
10163 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10164
10165 try
10166 {
10167 gl::Context *context = gl::getNonLostContext();
10168
10169 if (context)
10170 {
10171 if (offset < 0 || length < 0)
10172 {
10173 return gl::error(GL_INVALID_VALUE);
10174 }
10175
10176 if (!gl::ValidBufferTarget(context, target))
10177 {
10178 return gl::error(GL_INVALID_ENUM);
10179 }
10180
10181 gl::Buffer *buffer = context->getTargetBuffer(target);
10182
10183 if (buffer == NULL)
10184 {
10185 return gl::error(GL_INVALID_OPERATION);
10186 }
10187
10188 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10189 {
10190 return gl::error(GL_INVALID_OPERATION);
10191 }
10192
10193 // Check for buffer overflow
10194 size_t offsetSize = static_cast<size_t>(offset);
10195 size_t lengthSize = static_cast<size_t>(length);
10196
10197 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10198 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10199 {
10200 return gl::error(GL_INVALID_VALUE);
10201 }
10202
10203 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10204 }
10205 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010206 catch (...)
Shannon Woods916e7692014-03-27 16:58:22 -040010207 {
10208 return gl::error(GL_OUT_OF_MEMORY);
10209 }
10210}
10211
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010212__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10213{
10214 struct Extension
10215 {
10216 const char *name;
10217 __eglMustCastToProperFunctionPointerType address;
10218 };
10219
10220 static const Extension glExtensions[] =
10221 {
10222 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010223 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010224 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010225 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10226 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10227 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10228 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10229 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10230 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10231 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010232 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010233 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010234 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10235 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10236 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10237 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010238 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10239 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10240 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10241 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10242 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10243 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10244 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010245 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010246 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10247 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10248 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010249 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
Shannon Woodsb3801742014-03-27 14:59:19 -040010250 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10251 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10252 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
Shannon Woods916e7692014-03-27 16:58:22 -040010253 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10254 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10255 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010256
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010257 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010258 {
10259 if (strcmp(procname, glExtensions[ext].name) == 0)
10260 {
10261 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10262 }
10263 }
10264
10265 return NULL;
10266}
10267
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010268// Non-public functions used by EGL
10269
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010270bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010271{
10272 EVENT("(egl::Surface* surface = 0x%0.8p)",
10273 surface);
10274
10275 try
10276 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010277 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010278
10279 if (context)
10280 {
10281 gl::Texture2D *textureObject = context->getTexture2D();
Geoff Lang32d508e2014-02-11 09:39:48 -050010282 ASSERT(textureObject != NULL);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010283
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010284 if (textureObject->isImmutable())
10285 {
10286 return false;
10287 }
10288
Geoff Lang32d508e2014-02-11 09:39:48 -050010289 textureObject->bindTexImage(surface);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010290 }
10291 }
Jamie Madillde0ec752014-05-05 15:10:38 -040010292 catch (...)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010294 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010295 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010296
10297 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010298}
10299
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010300}